首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 視訊監控系列(4):客戶端音訊接收與截圖功能實作

     編輯:關於C#

本文實作客戶端音訊播放控制與畫面截圖存檔,重點說明截圖回調委派的正確簽名(IntPtr 接收緩衝指標)與停用回調的技巧。

介面參考

客戶端介面草圖

一、音訊接收與音量控制


if (cs >= 0)
{
    PcHikClient.MP4_ClientAudioStart(cs);     // 開啟聲音
    PcHikClient.MP4_ClientAudioVolume(0xFFFF); // 最大音量 (0~0xFFFF)
}

服務端預設開啟音訊採集,客戶端只需呼叫 AudioStart 即可播放。AudioStop 可關閉。

二、截圖功能(回調模式)

常數定義


private const int T_UYVY = 1;
private const int T_YV12 = 3;
private const int T_RGB32 = 7;

委派與回調


// 正確委派簽名:pBuf 使用 IntPtr
private delegate void CapPicFun(int stockHandle, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved);

private CapPicFun cpf;

private void Form1_Load(object sender, EventArgs e)
{
    cpf = new CapPicFun(CapPicFun1); // 成員變數實例化
}

private void btnSnapshot_Click(object sender, EventArgs e)
{
    // 註冊截圖回調
    PcHikClient.MP4_ClientSetCapPicCallBack(cs, cpf);
}

public void CapPicFun1(int stockHandle, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved)
{
    string file = nType switch
    {
        T_UYVY => @"c:\uyvy.bmp",
        T_YV12 => @"c:\yv12.bmp",
        T_RGB32 => @"c:\rgb32.bmp",
        _ => null
    };

    if (file != null)
    {
        PcHikClient.MP4_ClientSavePicFile(pBuf, nSize, nWidth, nHeight, nType, file);
    }

    // 截圖完成後立即移除回調,避免持續觸發
    PcHikClient.MP4_ClientSetCapPicCallBack(cs, null);
}

關鍵點總結

  1. 委派簽名:pBuf 必須為 IntPtr,早期版本用 byte[] 會導致存檔畫面全黑。
  2. 回調停用:SDK 文件註明「一旦設定回調一直有效直到程式結束」,需在回調內呼叫 SetCapPicCallBack(..., null) 停用。
  3. 執行時機:必須在客戶端已連線、畫面正常顯示後再點擊截圖,否則回調不觸發。
  4. 預設格式:未特別設定時通常為 YV12,C 槽根目錄會產生 yv12.bmp。

修正記錄

  • 2009-02-27:委派與 SavePicFile 的 pBuf 參數由 byte[] 改為 IntPtr,解決截圖全黑問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved