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

C# 視訊監控系列(九):伺服器端資料捕獲——截圖與錄影實作(一)

     編輯:關於C語言

前言:錄影功能的核心地位與儲存策略

錄影是監控系統最核心功能之一。除了本文實作的基本擷取邏輯,實際專案還需自行規劃完整的儲存策略:

  • 儲存容量規劃(單檔大小、總保留天數)
  • 分時段錄影(僅上班時間、偵測觸發錄影)
  • 磁碟分區與 RAID 容錯
  • 舊檔自動覆寫/刪除機制

一、截圖功能實作

VC++ 伺服器端範例未直接提供截圖代碼,但可參考 CSDN 社群常見做法:

VC++ 參考代碼

int ret = GetJpegImage(aa, bb, cc, dd);
if(ret == 0){
    CString str;
    str.Format("ch%02d_%s.jpg", iLastSelect, CSStartTime);
    FILE *pFile = fopen(str.GetBuffer(0), "wb");
    if(pFile){
        fwrite(bb, cc, 1, pFile); // 儲存影像
        fclose(pFile);
    }
}

C# 實作:呼叫 GetJpegImage 並儲存

byte[] imageBuf = new byte[704 * 576 * 2];
int size = 704 * 576 * 2;

HikVisionSDK.GetJpegImage(ChannelHandle, imageBuf, out size, 100);

using (MemoryStream ms = new MemoryStream(imageBuf))
{
    Image image = Image.FromStream(ms, true);
    image.Save(@"C:\1.jpg");
}

重要:API 簽名修正

經實測驗證,原範例的 GetJpegImage/GetOriginalImage 簽名有誤,**請務必更新為以下正確版本**:

// 取得原始圖像 (BMP 格式)
public static extern int GetOriginalImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size);

// 取得 JPEG 壓縮圖像
public static extern int GetJpegImage(IntPtr hChannelHandle, byte[] ImageBuf, out int Size, uint nQuality);
  • nQuality:JPEG 品質參數 (1-100),範例傳 100 為最高品質
  • out int Size:回傳實際資料長度,配合 MemoryStream 正確截取有效資料
  • 儲存 BMP 同理,只需將 Image.FromStream 後 Save 時指定 ImageFormat.Bmp

二、錄影功能架構概覽

錄影檔案包含三大區塊:

  1. 檔頭:系統標頭資料 (PktSysHeader),含編碼參數、解析度等,僅寫入一次
  2. 資料流:I/P/B 幀、音訊幀、子碼流資料,持續追加寫入
  3. 檔尾:結束碼 0x00000002,標記檔案正常結束

下一篇將詳細剖析 VC++ 官方範例的完整錄影流程與 C# 移植細節。

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