Video for Windows (VFW) 雖屬舊世代 API,但在相容性與簡易性上仍具優勢。本文以 AVICAP 模組為核心,說明建立擷取視窗、連結驅動程式、設定回呼函式、擷取參數配置與即時預覽/儲存的完整流程。
capCreateCaptureWindowcapSetUserData(將 this 指標存入)capSetCallbackOnVideoStreamcapGetDriverDescription(可選)capDriverConnectcapPreview, capCaptureSequence
HWND hCapWnd = capCreateCaptureWindow(
_T("MyCapture"), WS_CHILD | WS_VISIBLE,
0, 0, 640, 480, m_hWnd, 1001);
WS_CHILD|WS_VISIBLE 嵌入對話框/視圖。
capSetUserData(hCapWnd, (LPVOID)this);
回呼函式中可用 capGetUserData(hwnd) 取回 this,進而存取成員變數。
LRESULT CALLBACK OnVideoStream(HWND hWnd, LPVIDEOHDR lpVHdr)
{
CMyClass* pThis = (CMyClass*)capGetUserData(hWnd);
if (!pThis) return 0;
// lpVHdr->lpData 指向原始影像緩衝區 (通常為 YUY2/RGB24)
// lpVHdr->dwBytesUsed 為有效位元組數
// 這裡可寫入 AVI 檔案、網路傳送、影像處理等
pThis->ProcessFrame(lpVHdr->lpData, lpVHdr->dwBytesUsed);
return 1; // 非 0 表示已處理
}
capSetCallbackOnVideoStream(hCapWnd, OnVideoStream);
int driverIndex = 0; // 通常第一個裝置為 0
capDriverConnect(hCapWnd, driverIndex);
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 640;
bmi.bmiHeader.biHeight = 480;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24; // RGB24
bmi.bmiHeader.biCompression = BI_RGB;
capSetVideoFormat(hCapWnd, &bmi, sizeof(bmi));
// 設定幀率 (微秒/幀) 30fps ≈ 33333
capSetFrameRate(hCapWnd, 33333);
// 即時預覽
capPreview(hCapWnd, TRUE);
// 錄製 AVI (需先 capFileSetCaptureFile)
capFileSetCaptureFile(hCapWnd, _T("capture.avi"));
capCaptureSequence(hCapWnd); // 開始錄製
// ...
capCaptureStop(hCapWnd); // 停止錄製
capGetDriverDescription 索引 0-9 對應不同裝置。若系統有多攝像頭,需逐一列舉讓使用者選擇:
TCHAR name[80], ver[80];
for (int i = 0; i < 10; ++i) {
if (capGetDriverDescription(i, name, 80, ver, 80)) {
// 將 name 加入下拉清單供使用者選擇
}
}
VFW 同樣支援音訊:capSetCallbackOnWaveStream 設定音訊回呼,capSetAudioFormat 設定格式,錄製 AVI 時會自動交織音視訊。
新專案建議改用 DirectShow 或 Media Foundation,支援更多編碼器、硬體加速、網路串流與現代容器格式(MP4/MKV)。VFW 適合維護舊專案或極簡單需求。