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

C# 視訊監控系列(十三):H.264 播放器——播放控制與截圖(五)

     編輯:關於C語言

二、截圖功能實作

VC++ 官方回調實作

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;
}

C# 實作:以委托實例控制回調啟停


// 顯示回調委托型別
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 文件警告:回調中請盡快返回,大檔建議另開執行緒

API 文件重點提醒

  • Hik_PlayM4_SetDisplayCallBack:設定顯示回調函數,**注意要盡快返回**,若要停止回調,將函數指標設為 NULL (C# 為 null)
  • Hik_PLayM4_ConvertToBmpFile:支援 T_UYVY/T_YV12/T_RGB32 等多種 YUV/RGB 格式轉 BMP
  • 截圖解析度 = 目前播放影像原始解析度,非畫面顯示大小

結束

播放控制 (播放/暫停/停止/快進/慢放/跳轉) 與截圖功能至此完整涵蓋。目前正嘗試語音對講功能開發,遇到一些阻礙... 持續努力中!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved