VC++ 6.0 基於 VFW 開發攝像頭采集程序,運行時預覽窗口黑屏,但保存的 AVI 文件播放正常。
capCreateCaptureWindow 的 hwndParent 參數傳遞錯誤。原代碼:
m_CapWnd = capCreateCaptureWindow(
TEXT("My Video Capture"),
WS_CHILD | WS_VISIBLE,
0, 0, LocalRect.Width(), LocalRect.Height(),
LocalWnd->GetSafeHwnd(), // 錯誤:傳遞了顯示窗口句柄
IDC_VIDEO_LOCAL); // 控件 ID
第 7 參數 必須是父窗口句柄(即容器視圖的 HWND),而非顯示窗口自身句柄。傳遞顯示窗口句柄導致 VFW 內部無法正確建立預覽鏈路,但捕獲管道獨立工作,故錄制正常。
// 假設 m_VideoDisplay 是用於顯示的 CStatic 或 CWnd 成員變量
HWND hParent = m_VideoDisplay.GetSafeHwnd(); // 父容器句柄
m_CapWnd = capCreateCaptureWindow(
TEXT("My Video Capture"),
WS_CHILD | WS_VISIBLE,
0, 0, rect.Width(), rect.Height(),
hParent, // 正確:父窗口句柄
IDC_VIDEO_LOCAL);
capCreateCaptureWindow 創建的是捕獲窗口(隱藏),負責驅動攝像頭、壓縮、預覽回調。WM_CAP_SET_PREVIEW、WM_CAP_SET_PREVIEWRATE 繪製到父窗口客戶區。capGetVideoFormat 返回的 BITMAPINFOHEADER 確認分辨率/幀率是否被驅動支持。GraphEdit (DirectShow 工具) 驗證攝像頭 Filter Graph 是否正常構建。capSetCallbackOnError 註冊錯誤回調輸出詳細 HRESULT。VFW 已停止維護 20 年。新項目請使用 Media Foundation (Windows) 或 OpenCV VideoCapture / FFmpeg 跨平台采集,API 更清晰、硬件加速支持更好。