本文實作客戶端音訊播放控制與畫面截圖存檔,重點說明截圖回調委派的正確簽名(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);
}
pBuf 必須為 IntPtr,早期版本用 byte[] 會導致存檔畫面全黑。SetCapPicCallBack(..., null) 停用。yv12.bmp。SavePicFile 的 pBuf 參數由 byte[] 改為 IntPtr,解決截圖全黑問題。