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

VC++ 視訊擷取與壓縮預覽實作

     編輯:關於VC++

前言

承接前作「即時語音通訊」,作者嘗試擴充至視訊功能:擷取攝影機畫面、即時預覽、選擇壓縮器編碼/解碼、單幀擷圖儲存。本文整理核心流程與關鍵 API,供有興趣開發視訊聊天/監控的開發者參考。

核心架構

  • VideoDll.dll:封裝 Video for Windows (VFW) cap* 系列 API 及壓縮/解壓縮邏輯 (ICCompress/ICDecompress)。
  • 主程式:負責 UI、壓縮器選擇、網路傳送 (Socket) 及顯示回呼畫面。

初始化流程 (OnInitDialog)

void CVideoPlayBackDlg::OnInitDialog()
{
    // 1. 設定擷取格式 (BITMAPINFO)
    InitCaptureFormat(); // 填寫 m_InInfo: 寬高、位深、壓縮格式等

    // 2. 載入 VideoDll.dll 並初始化壓縮變數 COMPVARS
    LoadLibrary(_T("VideoDll.dll"));
    ICCompressGetFormat(...); // 取得壓縮後格式
    ICCompressBegin(...);     // 初始化壓縮器

    // 3. 開啟視訊裝置並開始預覽
    InitVideoCard();
}

關鍵函式:InitVideoCard

void CVideoPlayBackDlg::InitVideoCard()
{
    // 連接驅動程式 (裝置索引 0)
    if (!capDriverConnect(m_hWndCapture, 0))
        AfxMessageBox(_T("Driver Connect Failure"));

    // 設定視訊格式
    if (!capSetVideoFormat(m_hWndCapture, &m_InInfo, sizeof(BITMAPINFO)))
        AfxMessageBox(_T("Fail to set video format"));

    // 設定預覽幀率 (24 fps)
    capPreviewRate(m_hWndCapture, 24);

    // 啟用預覽 (畫面直接顯示在 m_hWndCapture 視窗)
    capPreview(m_hWndCapture, TRUE);

    // 設定單幀回呼函式
    if (!capSetCallbackOnFrame(m_hWndCapture, FrameCallBack))
        AfxMessageBox(_T("fail to setCallbackOnFrame function"));
}

核心回呼:FrameCallBack

每擷取一幀即觸發,執行壓縮、解壓縮、畫面刷新、網路發送:

LRESULT CALLBACK FrameCallBack(HWND hWnd, LPVIDEOHDR lpVHdr)
{
    // 1. 壓縮原始幀資料
    ICCompress(m_hIC, lpVHdr->lpData, lpVHdr->dwBytesUsed, ...);

    // 2. 解壓縮供本地預覽
    ICDecompress(m_hICDecomp, ...);

    // 3. 觸發視窗重繪顯示最新幀
    InvalidateRect(hWndPreview, NULL, FALSE);

    // 4. 網路發送 (Socket) - 參考語音通訊傳送機制
    // send(sock, compressedBuf, compressedLen, 0);

    return TRUE; // 繼續回呼
}

資源釋放

void CVideoPlayBackDlg::OnDestroy()
{
    capSetCallbackOnFrame(m_hWndCapture, NULL);
    capPreview(m_hWndCapture, FALSE);
    capDriverDisconnect(m_hWndCapture);
    ICCompressEnd(m_hIC);
    ICDecompressEnd(m_hICDecomp);
    FreeLibrary(hVideoDll);
    CDialog::OnDestroy();
}

關鍵 API 對照表

功能VFW API壓縮 API
開啟裝置capCreateCaptureWindow / capDriverConnect-
設定格式capSetVideoFormatICCompressGetFormat
預覽capPreview / capPreviewRate-
單幀回呼capSetCallbackOnFrame-
壓縮-ICSeqCompressFrame / ICCompress
解壓縮-ICDecompress
儲存 AVIcapFileSaveAs / AVISaveV-

已知挑戰與改進方向

  • 音訊同步:需獨立音訊串流並以時間戳對齊,VFW 無內建同步機制。
  • 延遲優化:雙緩衝/環狀緩衝、非同步壓縮、關鍵幀間隔調整。
  • 網路傳輸:RTP/RTCP、前向錯誤修正 (FEC)、自適應位元率。
  • 現代替代方案:DirectShow / Media Foundation / FFmpeg 提供更完整管線支援。

完整原始碼含 VideoDll.dll 專案與主程式,可向作者索取:terrist007@163.com

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