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

VC++ 攝影機控制 SDK 核心原始碼解析 (Video for Windows / VFW)

     編輯:VC 教學

核心架構

基於 **Video for Windows (VFW)** 標準介面,vfw32.lib 提供捕獲視窗、驅動連線、預覽、覆疊、對話框、檔案寫入、回呼等完整功能。

關鍵全域狀態

HWND ghWndCap;              // 捕獲視窗句柄
CAPDRIVERCAPS gCapDriverCaps; // 驅動能力結構
CAPSTATUS gCapStatus;         // 捕獲狀態
char szCaptureFile[] = "MYCAP.AVI"; // 輸出檔案

三大回呼函數

回呼觸發時機典型用途
StatusCallbackProc狀態變更 (啟動/停止/錯誤)更新 UI 狀態列、調整視窗大小
ErrorCallbackProc驅動/捕獲錯誤MessageBox 顯示錯誤碼/文字
FrameCallbackProc每幀資料就緒**即時處理/寫檔/分析** (此處寫入 caram.dat)

初始化流程 (WM_CREATE)

// 1. 建立捕獲視窗 (Child, Visible)
ghWndCap = capCreateCaptureWindow(
    "Capture Window", WS_CHILD|WS_VISIBLE, 0,0,300,240, hwnd, 0);

// 2. 註冊回呼
capSetCallbackOnError(ghWndCap, ErrorCallbackProc);
capSetCallbackOnStatus(ghWndCap, StatusCallbackProc);
capSetCallbackOnFrame(ghWndCap, FrameCallbackProc);

// 3. 連線驅動 (索引 0 = 第一個裝置)
capDriverConnect(ghWndCap, 0);

// 4. 查詢驅動能力
capDriverGetCaps(ghWndCap, &gCapDriverCaps, sizeof(CAPDRIVERCAPS));

// 5. 設定預覽速率 (66ms ≈ 15fps) 並啟動預覽
capPreviewRate(ghWndCap, 66);
capPreview(ghWndCap, TRUE);

// 6. 依能力啟用進階功能
if (gCapDriverCaps.fHasOverlay) capOverlay(ghWndCap, TRUE);          // 覆疊 (硬體加速顯示)
if (gCapDriverCaps.fHasDlgVideoSource) capDlgVideoSource(ghWndCap);  // 影像來源對話框
if (gCapDriverCaps.fHasDlgVideoFormat) capDlgVideoFormat(ghWndCap);  // 格式/解析度/幀率
if (gCapDriverCaps.fHasDlgVideoDisplay) capDlgVideoDisplay(ghWndCap); // 顯示屬性

// 7. 設定捕獲檔案與緩衝 (5MB)
capFileSetCaptureFile(ghWndCap, szCaptureFile);
capFileAlloc(ghWndCap, 1024L*1024L*5);

// 8. 開始捕獲序列 / 單幀抓取
capCaptureSequence(ghWndCap); // 連續捕獲到 AVI
capGrabFrame(ghWndCap);       // 單幀捕獲 (觸發 FrameCallback)

清理流程 (WM_DESTROY)

capSetCallbackOnStatus(ghWndCap, NULL);
capSetCallbackOnError(ghWndCap, NULL);
capSetCallbackOnFrame(ghWndCap, NULL);
capCaptureAbort(ghWndCap);      // 停止捕獲
capDriverDisconnect(ghWndCap);  // 斷開驅動
PostQuitMessage(0);

關鍵 API 速查

現代替代方案

  • DirectShow (已棄用但仍廣泛使用);
  • Media Foundation (Win7+ 推薦,支援硬體編碼);
  • OpenCV VideoCapture (跨平台、C++ 友善、整合影像處理);
  • Windows Runtime MediaCapture (UWP/Win10+)。

遺留代碼維護提示

  • VFW 為 32-bit 介面,64-bit 應用需 WoW64 或改用現代 API;
  • AVIFile 系列函數寫入 AVI 有 2GB/4GB 檔案大小限制;
  • 編碼器選擇:capFileSetCaptureFile 後可用 capFileSetInfoChunk 或壓縮對話框指定 codec;
  • 錯誤碼參考 vfw.h 定義,常見:DV_ERR_NOTSUPPORTED、DV_ERR_NOMEM、DV_ERR_INVALHANDLE。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數用途
capCreateCaptureWindow建立捕獲視窗 (內部建立類別 "CAPTURE")
capDriverConnect/Disconnect連接/斷開視訊驅動
capDriverGetCaps取得驅動能力結構 (CAPDRIVERCAPS)
capPreviewRate/Preview設定/啟動預覽模式
capOverlay啟用硬體覆疊 (繞過 GDI,低延遲)
capDlgVideoSource/Format/Display呼叫系統標準設定對話框
capFileSetCaptureFile/Alloc設定 AVI 輸出檔、預分配磁碟空間
capCaptureSequence開始連續捕獲 (寫入 AVI)
capGrabFrame單幀捕獲 (觸發 FrameCallback)
capCaptureAbort中止捕獲