void CALLBACK DisplayCBFun(long nPort,
char * pBuf, long nSize,
long nWidth, long nHeight,
long nStamp, long nType, long nReceaved)
{
if(!g_bCapPic) return;
CString csFile;
csFile.Format("capture%02d.bmp", pic++);
// 注意:此函數較慢,若要存 .bmp 請勿頻繁呼叫
if(!Hik_PLayM4_ConvertToBmpFile(pBuf, nSize, nWidth, nHeight, nType,
csFile.GetBuffer(csFile.GetLength())))
{
CString csErr;
csErr.Format("Convert to bmp faild(%d).", Hik_PlayM4_GetLastError(nPort));
AfxMessageBox(csErr);
}
g_bCapPic = FALSE;
}
// 顯示回調委托型別
private delegate void DisplayCBFun(int nPort, IntPtr pBuf, int nSize,
int nWidth, int nHeight, int nStamp, int nType, int nReceaved);
private DisplayCBFun DisCB;
///
/// 截圖按鈕點擊:註冊顯示回調
///
private void btnCapImage_Click(object sender, EventArgs e)
{
DisCB = new DisplayCBFun(DisplayCBFun);
HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, DisCB);
}
///
/// 截圖回調函數:將當前幀轉存為 BMP
///
public void DisplayCBFun(int nPort, IntPtr pBuf, int nSize,
int nWidth, int nHeight, int nStamp, int nType, int nReceaved)
{
string fileName = string.Format(@"C:\capture{0}.bmp", nPort);
// ConvertToBmpFile 回傳 false 表示失敗
if (!HikPlayer.Hik_PLayM4_ConvertToBmpFile(pBuf, nSize, nWidth, nHeight, nType, fileName))
{
MessageBox.Show("轉換 BMP 失敗!錯誤碼:" + HikPlayer.Hik_PlayM4_GetLastError(nPort));
}
// 截圖完成後移除回調,避免持續觸發
HikPlayer.Hik_PlayM4_SetDisplayCallBack(PORT, null);
}
| VC++ 版本 | C# 版本 | 說明 |
|---|---|---|
全域旗標 g_bCapPic 控制 | 委托實例 DisCB / null 控制 | C# 事件模式更符合語言慣例 |
檔名遞增 pic++ | 固定含埠號檔名 | 建議改用時間戳或流水號避免覆蓋 |
| 同步轉檔 (阻塞) | 同步轉檔 (同樣阻塞) | API 文件警告:回調中請盡快返回,大檔建議另開執行緒 |
Hik_PlayM4_SetDisplayCallBack:設定顯示回調函數,**注意要盡快返回**,若要停止回調,將函數指標設為 NULL (C# 為 null)Hik_PLayM4_ConvertToBmpFile:支援 T_UYVY/T_YV12/T_RGB32 等多種 YUV/RGB 格式轉 BMP播放控制 (播放/暫停/停止/快進/慢放/跳轉) 與截圖功能至此完整涵蓋。目前正嘗試語音對講功能開發,遇到一些阻礙... 持續努力中!