核心架構
基於 **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 速查
| 函數 | 用途 |
capCreateCaptureWindow | 建立捕獲視窗 (內部建立類別 "CAPTURE") |
capDriverConnect/Disconnect | 連接/斷開視訊驅動 |
capDriverGetCaps | 取得驅動能力結構 (CAPDRIVERCAPS) |
capPreviewRate/Preview | 設定/啟動預覽模式 |
capOverlay | 啟用硬體覆疊 (繞過 GDI,低延遲) |
capDlgVideoSource/Format/Display | 呼叫系統標準設定對話框 |
capFileSetCaptureFile/Alloc | 設定 AVI 輸出檔、預分配磁碟空間 |
capCaptureSequence | 開始連續捕獲 (寫入 AVI) |
capGrabFrame | 單幀捕獲 (觸發 FrameCallback) |
capCaptureAbort | 中止捕獲 |
現代替代方案
- 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。
- 上一篇文章: VC++ 兩種 HTTP 取網頁原始碼方案比較:CInternetSession vs MSXML XMLHTTP
- 下一篇文章: VC++ 解析格式化文字設定檔:自定義語法 + C++ 封裝類完整實作
Copyright ©
程式碼之家 All Rights Reserved