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

VC++ 攝像頭視訊擷取與播放:VFW (AVICAP) 完整實作指南

     編輯:VC 教學

前言

Video for Windows (VFW) 雖屬舊世代 API,但在相容性與簡易性上仍具優勢。本文以 AVICAP 模組為核心,說明建立擷取視窗、連結驅動程式、設定回呼函式、擷取參數配置與即時預覽/儲存的完整流程。

核心步驟總覽

  1. 建立擷取視窗:capCreateCaptureWindow
  2. 關聯使用者資料:capSetUserData(將 this 指標存入)
  3. 設定視訊串流回呼:capSetCallbackOnVideoStream
  4. 取得驅動程式資訊:capGetDriverDescription(可選)
  5. 連結驅動程式:capDriverConnect
  6. 設定擷取參數:解析度、幀率、壓縮格式等
  7. 開始/停止預覽與錄製:capPreview, capCaptureSequence

關鍵程式碼片段

1. 建立擷取視窗


HWND hCapWnd = capCreateCaptureWindow(
    _T("MyCapture"), WS_CHILD | WS_VISIBLE,
    0, 0, 640, 480, m_hWnd, 1001);
  • 參數 1:視窗名稱(僅供除錯)。
  • 參數 2:視窗樣式,通常 WS_CHILD|WS_VISIBLE 嵌入對話框/視圖。
  • 參數 3-6:位置與大小(即預覽畫面大小)。
  • 參數 7:父視窗控制代碼。
  • 參數 8:子視窗 ID。

2. 關聯類別指標(供回呼使用)


capSetUserData(hCapWnd, (LPVOID)this);

回呼函式中可用 capGetUserData(hwnd) 取回 this,進而存取成員變數。

3. 視訊串流回呼函式


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 表示已處理
}

4. 設定回呼並連結驅動程式


capSetCallbackOnVideoStream(hCapWnd, OnVideoStream);

int driverIndex = 0; // 通常第一個裝置為 0
capDriverConnect(hCapWnd, driverIndex);

5. 設定擷取參數(解析度、幀率、壓縮)


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);

6. 開始預覽與錄製 AVI


// 即時預覽
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 適合維護舊專案或極簡單需求。

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