日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[转]视频捕捉全教程(vc+vfw)

發(fā)布時間:2024/3/26 c/c++ 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]视频捕捉全教程(vc+vfw) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目 錄

一. 視頻捕獲快速入門

二.基本的捕獲設置

??????????1.設置捕獲速度:

??????????2.設置終止捕獲

??????????3.捕獲的時間限制

三.關于捕獲窗口

????????? 1.創(chuàng)建一個AVICAP捕獲窗口

????????? 2.將一個捕獲窗口連接至捕獲設備

??????????3. 父窗口與子窗口的交互

????????? 4.捕獲窗口的狀態(tài)

四.視頻捕獲驅動和音頻驅動

????????? 1.視頻捕獲驅動的性能:

??????????2.視頻對話框:

???????? ?3.PREVIEW 和 OVERLAY模式:

??????? ??4.視頻格式

????? ????5.視頻捕獲設置

?????? ?? 6.聲頻格式

五.使用視頻捕獲

????????1.創(chuàng)建捕獲窗口(CREATING A CAPTURE WINDOW)

??????? 2.連接到捕獲驅動(CONNECTING TO A CAPTURE DRIVER)

????????3.列舉所有已安裝的捕獲驅動(ENUMERATING INSTALLED CAPTURE DRIVERS)

????????4.得到捕獲驅動的性能(OBTAINING THE CAPABILITIES OF A CAPTURE DRIVER)

????????5.得到捕獲窗口的狀態(tài)(OBTAINING THE STATUS OF A CAPTURE WINDOW)

????????6.顯示對話框設置視頻特征(DISPLAYING DIALOG BOXES TO SET VIDEO CHARACTERISTICS)

????????7.得到和設置視頻格式(OBTAINING AND SETTING THE VIDEO FORMAT)

????????8. 預覽視頻(PREVIEWING VIDEO)

????????9.將視頻設置為OVERLAY模式(ENABLING VIDEO OVERLAY)

????????10.命名捕獲文件(NAMING THE CAPTURE FILE)

????????11.格式化聲頻捕獲(FORMATTING AUDIO CAPTURE)

????????12.改變視頻捕獲設置(CHANGING A VIDEO CAPTURE SETTING)

??????? 13.捕獲數(shù)據(jù)(CAPTURING DATA)

????????14.增加一個信息塊(ADDING AN INFORMATION CHUNK)

????????15.在程序中加入一個回調函數(shù)(ADDING CALLBACK FUNCTIONS TO AN APPLICATION)

??????? 16.創(chuàng)建一個狀態(tài)回調函數(shù)(CREATING A STATUS CALLBACK FUNCTION)

????????17.創(chuàng)建一個錯誤回調函數(shù)( CREATING AN ERROR CALLBACK FUNCTION)

??????? 18.創(chuàng)建一個框架回調函數(shù)(CREATING A FRAME CALLBACK FUNCTION)

六.將四個標準對話框改成函數(shù)調用形式

???????? AUDIOFORMAT對話框

???????? VIDEOFORMAT對話框

???????? VIDEOSOURCE對話框

???????? VIDEO COMPRESSION對話框  

前 言

?????????視頻捕獲是指由專用的視頻采集卡捕獲聲頻和視頻信息,然后將其進行數(shù)據(jù)化處理,再經過軟件的壓縮進行處理,這時就可對這些數(shù)據(jù)進行保存、回放、傳輸?shù)雀鞣N操作。

???????? Windows專門提供了Video for Windows來對視頻處理進行支持,提供的接口可以被大多數(shù)的視頻采集卡支持,并有多種視頻壓縮驅動供選擇(當然視頻壓縮可以自己開發(fā)),采集卡支持攝像頭,TV等多種輸入。


一. 視頻捕獲快速入門

????????? 視頻捕捉將一個視頻流和音頻流數(shù)字化, 然后存儲在硬盤或其他存儲介質上.

????????? 一個AVICap視窗口句柄描述了聲頻與視頻流的細節(jié), 這樣就使你的應用程序從AVI文件格式, 聲頻視頻緩沖管理, 低層聲頻視頻驅動訪問等等解脫出來, AVICap為應用程序提供了一個靈活的介面, 你可以僅僅使用如下幾行代碼就可以將視頻捕捉加入你的程序:

hWndC = capCreateCaptureWindow ( "My Own Capture Window",

WS_CHILD | WS_VISIBLE , 0, 0, 160, 120, hwndParent, nID);

SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0 /* wIndex */, 0L);

SendMessage (hWndC, WM_CAP_SEQUENCE, 0, 0L);

?????????? 一個宏其實也是使用SendMessage, 只不過提供給程序一個更易讀的代碼而已, 下面的這些示例就是使用宏的方法將視頻捕捉加入程序:

hWndC = capCreateCaptureWindow ( "My Own Capture Window",

WS_CHILD | WS_VISIBLE , 0, 0, 160, 120, hwndParent, nID);

capDriverConnect (hWndC, 0);

capCaptureSequence (hWndC);


????????? 當你創(chuàng)建了一個AVICap類的捕捉窗口并將它連接到一個視頻驅動時, 此捕捉窗口即可以開始捕捉數(shù)據(jù), 你的程序可以簡單的發(fā)送WM_CAP_SEQUENCE消息(或者使用capCaptureSequence宏)來開始捕捉.

????????? 如果是缺省的設置, WM_CAP_SEQUENCE會開始捕捉視頻音頻流到CAPTURE.AVI文件中, 直到下面的某一事件發(fā)生為止:

用戶按下了ESC鍵或者一個鼠標鍵

你的應用程序終止或異常中斷捕捉操作

磁盤已滿


????????????? 在一個應用程序里, 你可以發(fā)送WM_CAP_STOP消息來終止捕捉數(shù)據(jù)(或者使用capCaptureStop宏), 你也可以發(fā)送WM_CAP_ABORT消息(或者使用capCaptureAbort宏)來終止.


二.基本的捕獲設置

????????? 基本的捕獲設置包括:設置捕獲速度(每秒捕獲多少幀),是否同時捕獲聲頻,捕獲緩沖,允許最大丟失多少幀,是否使用DOS內存,以及用鍵盤的哪個鍵或鼠標的哪個鍵來終止捕獲等等。這些基本的設置都可以使用CAPTUREPARAMS結構來描述,你可以使用capCaptureGetSetup宏來得到當前的設置,然后改變此結構的成員變量,再使用capCaptureSetSetup宏設置新的設置。

例如:

1.設置捕獲速度:

?????????? 捕捉速度是指捕捉任務每秒鐘捕獲的幀數(shù), 你可以發(fā)送WM_CAP_GET_SEQUENCE_SETUP消息(或者使用capCaptureGetSetup宏)來得到當前的捕捉速度, 當前的捕捉速度保存在CAPTUREPARAMS結構的dwRequestMicroSecPerFrame成員變量中, 你可以通過設置此變量來改變當前設置, 單位是每毫秒連續(xù)的幀數(shù), 你可以發(fā)送WM_CAP_SET_SEQUENCE_SETUP消息(或者使用capCaptureSetSetup宏), dwRequestMicroSecPerFrame的值是66667, 相當于每秒15幀.


2.設置終止捕獲

?????????? 你可以允許用戶按下某鍵或某組合鍵或者鼠標的左右鍵來終止一個捕獲任務, 如果是實時的捕獲, 則捕獲的文件將會被丟棄; 如果是單步捕獲, 在終止之前所捕獲的內容將會被保存.

????????? 你可以通過發(fā)送WM_CAP_GETQUENCE_SETUP消息(或者使用capCaptureGetSetup宏)來得到當前的設置, 當前的按鍵設置保存在CAPTUREPARAMS的vKeyAbort成員中, 當前的鼠標設置保存在fAbortLeftMouse和fAbortRightMouse成員中. 你可以設置新的按鍵或按鍵組合, 或者鼠標左右鍵, 當你修改的CAPTUREPARAMS后,應該發(fā)送WM_CAP_SET_SEQUENCE_SETUP消息來進行更新(或者使用capCaptureSetSetup宏). 缺省的按鍵是VK_ESCAPE. 你必須在指定按鍵之前使用RegisterHotKey函數(shù), 鼠標缺省的值是fAbortLeftMouse和fAbortRightMouse都為TRUE.


3.捕獲的時間限制

?????????? CAPTUREPARAMS結構中的fLimitEnabled指示是否有時間限度, wTimeLimit指示最大的持續(xù)時間, 單位為秒.

????????? 得到fLimitEnabled和wTimeLimit的值可以發(fā)送WM_CAP_GET_SEQUENCE_SETUP消息(或使用capCatureGetSetup宏), 當設置了這些成員變量后, 應該發(fā)送消息WM_CAP_SET_SEQUENCE_SETUP消息(或capCaptureSetSetup宏)來更新CAPTUREPARAMS結構.


三.關于捕獲窗口

??????? 在捕獲之前必須創(chuàng)建一個捕獲窗口(capture window),在發(fā)送消息或使用宏的過程中都需要使用此窗口。

1.創(chuàng)建一個AVICap捕獲窗口

??????? 你可以使用capCreateCaptureWindow函數(shù)來創(chuàng)建一個AVICap捕獲窗口, 此函數(shù)將會返回一個句柄, 此句柄以后在發(fā)送消息時要用.

??????? 你可以在一個程序里創(chuàng)建一個或多個捕獲窗口, 然后給每一個窗口連接不同的捕獲設置.


2.將一個捕獲窗口連接至捕獲設備

?????????? 你可以動態(tài)的在一個捕獲窗口與一個捕獲設備之前連接或斷接, 你可以發(fā)送WM_CAP_DRIVER_CONNECT消息來使一個捕獲窗口與一個捕獲設備連接或關聯(lián). 當連接上以后, 你就可以通過捕獲窗口向捕獲設備發(fā)送各種消息.

??????? 如果你的系統(tǒng)里裝有多個捕獲設備, 你可以在發(fā)送WM_CAP_DRIVER_CONNECT消息時用wParam參數(shù)指定使用哪一個, 此參數(shù)是登記在SYSTEM.INI文件的[drivers]一節(jié)里的列表中的某一項, 0為第一個.

????????? 你可以使用capGetDriverDescription函數(shù)來得到已安裝的捕獲設備的名稱及版本, 這樣你的程序就可以列舉所有已安裝的捕獲設備和驅動, 這樣用戶就可以選擇其中的一個來與你的捕獲窗口連接.

???????? 你可以發(fā)送WM_CAP_DRIVER_GET_NAME消息(或capDriverGetName宏)來得到連接到捕獲窗口的捕獲設備的名稱, 得到版本發(fā)送WM_CAP_DRIVER_GET_VERSION消息(或capDriverGetVersion宏)

???????? 你可以發(fā)送WM_CAP_DRIVER_DISCONNECT消息(或capDriverDisconnect宏)來斷接.


3. 父窗口與子窗口的交互

?????????? 一些象WM_PALETTECHANGED和WM_QUERYNEWPALETTE的系統(tǒng)級消息只能發(fā)送到頂級窗口或OVERLAPPED窗口, 如果一個捕獲窗口是子窗口,就必須通過父窗口轉送.

???????? 同樣的, 如果父窗口的尺寸改變了, 它就需要通知捕獲窗口, 相反地, 如果捕獲窗口的尺寸改變了, 捕獲窗口就需要發(fā)送消息給父窗口, 一個簡單的方法就是始終保持捕獲窗口的尺寸與視頻流的尺寸一致, 并隨時將尺寸的改變通知父窗口.


4.捕獲窗口的狀態(tài)

????????? 你可以發(fā)送WM_CAP_GET_STATUS消息(或capGetStatus宏)來得到當前捕獲窗口的狀態(tài), 得到的是一個CAPSTATUS結構的拷貝, 它包含圖片的尺寸, 卷軸的當前位置, overlay和preview是否已設置.

??????? 因為CAPSTATUS信息是動態(tài)的, 你的程序應該只要捕獲的視頻流的尺寸或格式可能發(fā)生了改變就應該進行刷新(例如: 顯示了捕獲設備的視頻格式以后).

??????? 改變捕獲窗口的尺寸并不影響實際的捕獲的視頻流的尺寸, 視頻捕獲設備的格式對話框捕獲頻流的尺寸.


四.視頻捕獲驅動和音頻驅動

1.視頻捕獲驅動的性能:

????????? 你可以通過發(fā)送WM_CAP_DRIVER_GET_CAPS消息(或者capDriverGetCaps宏)來得到當前連接的視頻驅動的硬件性能. 得到的信息保存在CAPDRIVERCAPS結構中.


2.視頻對話框:

????????? 每一個視頻驅動能夠提供四個對話框來控制視頻捕獲和數(shù)字化處理, 定義壓縮品質等, 這些對話框都定義在視頻捕獲驅動中.

????????? Video Source對話框用于控制選擇視頻來源, 此對話框列舉了此視頻捕獲卡連接的所有視頻源(典型的例如:SVHS和合成輸入), 并提供了改變色調, 對比度, 飽和度. 如果視頻驅動支持此對話框, 你就可以顯示并更新它, 使用WM_CAP_DLG_VIDEOSOURCE消息(或capDlgVideoSource宏).

?????????? Video Format對話框定義視頻幀的尺寸以及精度, 視頻捕獲卡的壓縮設置. 如果卡支持的話, 可以發(fā)送消息WM_CAP_DLG_VIDEOFORMAT消息或(capDlgVideoFormat宏).

?????????? Video Display對話框控制在視頻捕獲期間在顯示器上的顯示, 此控制不會影響視頻數(shù)字數(shù)據(jù), 但是他們可能會影響數(shù)字信號的表現(xiàn)形式, 例如: 如果捕獲設備支持overlay, 可能允許改變色調和飽和度, 關鍵色彩 或者overlay隊列. 如果卡支持, 你可以發(fā)送WM_CAP_DLG_VIDEODISPLAY消息(或者使用capDlgVideoDisplay宏).

?????????? Video Compression對話框控制壓縮品質, 如果卡支持, 發(fā)送消息WM_CAP_DLG_VIDEOCOMPRESSION(或capDlgVideoCompression宏).


3.Preview 和 Overlay模式:

???????????????? 一個視頻捕獲驅動對進入的視頻流有兩種工作模式: Preview模式和overlay模式, 如果一個捕獲驅動能夠執(zhí)行兩種方法, 用戶可以在其中選擇一種.

?????????????? Preview模式把從捕獲硬件傳來的數(shù)據(jù)送入系統(tǒng)內存并使用圖形設備介面(GDI)將數(shù)字化幀顯示在捕獲窗口內. 應用程序可以在父窗口失去焦點時減緩顯示速度, 當重新又得到焦點后加快顯示速度, 此種模式要占用大量CPU時間.

有三種消息控制Preview操作:

WM_CAP_SET_PREIVEW消息(capPreview宏)允許或禁止preview模式

WM_CAP_SET_PREVIEWRATE(capPreviewRate宏)當幀在preview模式顯示時設置速度.

WM_CAP_SET_SCALE(capPreviewScale宏)允許或禁止preview視頻的縮放比例.

????????? 當preview和scaling同時使用, 捕獲的視頻幀將會根據(jù)捕獲窗口的尺寸自動縮放, 允許preview模式會自動關閉overlay模式.

????????????????????? overlay模式是一個硬件函數(shù)它將數(shù)據(jù)送入捕獲緩沖區(qū)中因而不占用CPU資源. 你可以發(fā)送消息WM_CAP_SET_OVERLAY(或capOverlay宏)給捕獲窗口來啟用或終止overlay模式, 允許overlay模式會自動禁止preview模式.

?????????????? 你同時也可以在preview模式或overlay模式里發(fā)送WM_CAP_SET_SCROLL消息(或capSetScrollPos宏)來設置視頻幀的客戶區(qū)卷軸位置.


4.視頻格式

??????????? 你可以通過發(fā)送WM_CAP_GET_VIDEOFORMAT消息(或capGetVideoFormat和capGetVideoFormatSize宏)來得到視頻格式的結構或結構的尺寸. 你可以通過發(fā)送CAP_SET_VIDEOFORMAT消息(或capSetVideoFormat宏)來設置視頻格式.


5.視頻捕獲設置

?????????? CAPTUREPARMS結構包含了對視頻捕獲流的控制參數(shù), 你可以完成以下這些任務:

指定幀數(shù)

指定分配多少視頻緩沖

允許或禁止聲頻捕獲

指定捕獲的時間間隔

指定在捕獲的過程中是否使用MCI設置(VCR或者videodisc)

指定終止流的鍵盤或鼠標

specify the type of video averaging applied during capture.


得到:WM_CAP_GET_SEQUENCE_SETUP消息(或capCaptureGetSetup宏)

設置:WM_CAP_SET_SEQUENCE_SETUP消息(或capCaptureSetSetup宏)


6.聲頻格式

?????????????? 你可以通過發(fā)送WM_CAP_GET_AUDIOFORMAT消息(或capGetAudioFormat宏和capGetAudioFormatSize宏)來得到當前捕獲音頻數(shù)據(jù)的格式或尺寸格式。缺省的聲頻格式是:單聲道、8位、11kHz PCM。 當你使用WM_CAP_GET_AUDIOFORMAT時,總是使用WAVEFORMATEX結構。

???????????? 設置發(fā)送消息WM_CAP_SET_AUDIOFORMAT消息(或capSetAudioFormat宏),可以傳送WAVEFORMAT,WAVEFORMATEX,PCMWAVEFORMAT結構指針。

五.使用視頻捕獲

1.創(chuàng)建捕獲窗口(Creating a Capture Window)

hWndC = capCreateCaptureWindow (

(LPSTR) "My Capture Window", // window name if pop-up

WS_CHILD | WS_VISIBLE, // window style

0, 0, 160, 120, // window position and dimensions

(HWND) hwndParent,

(int) nID /* child ID */);


2.連接到捕獲驅動(Connecting to a Capture Driver)

?????????? 下面的例子是將MSVIDEO驅動連接到句柄為hWndC的捕獲窗口, 然后調用capDriverDisconnect宏來斷接.

fOK = SendMessage (hWndC, WM_CAP_DRIVER_CONNECT, 0, 0L);

//

// Or, use the macro to connect to the MSVIDEO driver:

// fOK = capDriverConnect(hWndC, 0);

//

// Place code to set up and capture video here.

//

capDriverDisconnect (hWndC);


3.列舉所有已安裝的捕獲驅動(Enumerating Installed Capture Drivers)

?????????? 下面的例子使用capGetDriverDescription函數(shù)得到已安裝的捕獲驅動的名稱及版本:

char szDeviceName[80];

char szDeviceVersion[80];


for (wIndex = 0; wIndex < 10; wIndex++)

{

if (capGetDriverDescription (wIndex, szDeviceName,

sizeof (szDeviceName), szDeviceVersion,

sizeof (szDeviceVersion))

{

// Append name to list of installed capture drivers

// and then let the user select a driver to use.

}

}


4.得到捕獲驅動的性能(Obtaining the Capabilities of a Capture Driver)

????????????? 發(fā)送WM_CAP_DRIVER_GET_CAPS消息可以得到捕獲驅動的性能,并保存入一個CAPDRIVERCAPS結構.每當程序連接一個新的捕獲驅動到一個捕獲窗口時, 就應該更新CAPDRIVERCAPS結構. 下面的程序舉例說明了如何使用capDriverGetCaps宏來得到捕獲驅動的性能:


CAPDRIVERCAPS CapDrvCaps;

SendMessage (hWndC, WM_CAP_DRIVER_GET_CAPS,

sizeof (CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);

// Or, use the macro to retrieve the driver capabilities.

// capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));


5.得到捕獲窗口的狀態(tài)(Obtaining the Status of a Capture Window)

???????????????? 下面的例子使用SetWindowPos函數(shù)使捕獲窗口與進來的視頻流尺寸保持一致, 視頻流的基本信息是使用capGetStatus宏得到的, 保存在CAPSTATUS結構中.


CAPSTATUS CapStatus;

capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS));

SetWindowPos(hWndC, NULL, 0, 0, CapStatus.uiImageWidth,

CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);


6.顯示對話框設置視頻特征(Displaying Dialog Boxes to Set Video Characteristics)

????????????? 每個視頻捕獲卡一般能提供三個不同的對話框用于控制視頻捕獲及數(shù)字化處理. 下面的例子說明如何顯示這些對話框, 在顯示這些對話框之前,使用了capDriverGetCaps宏來檢查CAPDRIVERCAPS結構, 以檢測該卡是否有顯示這些對話框:


CAPDRIVERCAPS CapDrvCaps;

capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));


// Video source dialog box.

if (CapDriverCaps.fHasDlgVideoSource)

capDlgVideoSource(hWndC);


// Video format dialog box.

if (CapDriverCaps.fHasDlgVideoFormat)

{

capDlgVideoFormat(hWndC);

// Are there new image dimensions?

capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS));

// If so, notify the parent of a size change.

}


// Video display dialog box.

if (CapDriverCaps.fHasDlgVideoDisplay)

capDlgVideoDisplay(hWndC);


7.得到和設置視頻格式(Obtaining and Setting the Video Format)

?????????????????? BITMAPINFO結構的長度既適應于標準的也適應于壓縮的數(shù)據(jù)格式, 所有程序必須總是詢問此結構的尺寸以便在得到當前的視頻格式之前分配內存. 下面的例子就是使用capGetVideoFormatSize宏來得到緩沖區(qū)尺寸并調用capGetVideoFormat宏來得到當前的視頻格式.


LPBITMAPINFO lpbi;

DWORD dwSize;

dwSize = capGetVideoFormatSize(hWndC);

lpbi = GlobalAllocPtr (GHND, dwSize);

capGetVideoFormat(hWndC, lpbi, dwSize);


// Access the video format and then free the allocated memory.


????????????? 程序可以使用capSetVideoFormat宏(或WM_CAP_SET_VIDEOFORMAT消息)發(fā)送一個BITMAPINFO頭結構給捕獲窗口, 因為視頻格式是設備細節(jié), 你的程序應該檢查返回值以便確定此格式是否已被接受.


8. 預覽視頻(Previewing Video)

???????????? 下面的例子使用capPreviewRate宏來設置每66毫秒顯示一幀, 并使用capPreview宏將它放置在捕獲窗口里.


capPreviewRate(hWndC, 66); // rate, in milliseconds

capPreview(hWndC, TRUE); // starts preview

// Preview

capPreview(hWnd, FALSE); // disables preview


9.將視頻設置為overlay模式(Enabling Video Overlay)

??????????? 下面的例子: capDriverGetCaps宏確定此捕獲卡是否有overlay功能, 如果有就使用宏來設置它


CAPDRIVERCAPS CapDrvCaps;

capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS));


if (CapDrvCaps.fHasOverlay)

capOverlay(hWndC, TRUE);


10.命名捕獲文件(Naming the Capture File)

???????????? 下面的例子: 使用capFileSetCaptureFile宏來指定預備文件名為:MYCAP.AVI, capFileAlloc宏預先指定它的大小為5M.


char szCaptureFile[] = "MYCAP.AVI";

capFileSetCaptureFile( hWndC, szCaptureFile);

capFileAlloc( hWndC, (1024L * 1024L * 5));


11.格式化聲頻捕獲(Formatting Audio Capture)

???????????? 下面的例子使用capSetAudioFormat來設置聲頻格式為:11kHz, PCM 8位, 立體聲


WAVEFORMATEX wfex;

wfex.wFormatTag = WAVE_FORMAT_PCM;

wfex.nChannels = 2; // Use stereo

wfex.nSamplesPerSec = 11025;

wfex.nAvgBytesPerSec = 22050;

wfex.nBlockAlign = 2;

wfex.wBitsPerSample = 8;

wfex.cbSize = 0;


capSetAudioFormat(hWndC, &wfex, sizeof(WAVEFORMATEX));


12.改變視頻捕獲設置(Changing a Video Capture Setting)

?????????????? 下面的例子使用capCaptureGetSetup和capCaptureSetSetup宏得將捕獲幀數(shù)從缺省的15幀改成每秒10幀.


CAPTUREPARMS CaptureParms;

float FramesPerSec = 10.0;


capCaptureGetSetup(hWndC, &CaptureParms, sizeof(CAPTUREPARMS));


CaptureParms.dwRequestMicroSecPerFrame = (DWORD) (1.0e6 /FramesPerSec);

capCaptureSetSetup(hWndC, &CaptureParms, sizeof (CAPTUREPARMS));


13.捕獲數(shù)據(jù)(Capturing Data)

??????????????? 下面的例子使用capCaptureSequence宏來開始捕獲視頻并使用capFileSaveAs宏來將捕獲的數(shù)據(jù)拷貝至NEWFILE.AVI文件中.


char szNewName[] = "NEWFILE.AVI";

// Set up the capture operation.

capCaptureSequence(hWndC);

// Capture.

capFileSaveAs(hWndC, szNewName);


14.增加一個信息塊(Adding an Information Chunk)

?????????????? 如果你需要在你的程序捕獲的聲頻和視頻數(shù)據(jù)中加入你的其他信息, 你可以創(chuàng)建一個信息塊并將它們插入捕獲文件中, 信息塊可以包含一些典型的信息, 例如:版權信息,視頻來源, 外部定位信息等. 下面的例子使用capFileSetInfoChunk宏來插入一個信息塊, 里面包含了一個SMPTE的時間代碼.


// This example assumes the application controls

// the video source for preroll and postroll.

CAPINFOCHUNK cic;

// .

// .

// .

cic.fccInfoID = infotypeSMPTE_TIME;

cic.lpData = "00:20:30:12";

cic.cbData = strlen (cic.lpData) + 1;

capFileSetInfoChunk (hwndC, &cic);


15.在程序中加入一個回調函數(shù)(Adding Callback Functions to an Application)

?????????????? 一個程序可以為捕獲窗口登記一個回調函數(shù)以便在以下的這些情況下通知程序.


狀態(tài)改變

錯誤發(fā)生

視頻框架和聲頻緩沖區(qū)變得可用

程序應用在捕獲視頻流的過程中接收


?????????? 下面的例子創(chuàng)建一個捕獲窗口并登記狀態(tài),錯誤,視頻流和框架回調函數(shù)在消息處理對列中, 也包括了一個終止回調函數(shù)的說明.


case WM_CREATE:

{

char achDeviceName[80]

char achDeviceVersion[100]

char achBuffer[100]

WORD wDriverCount = 0

WORD wIndex

WORD wError

HMENU hMenu


// Create a capture window using the capCreateCaptureWindow macro.

ghWndCap = capCreateCaptureWindow((LPSTR)"Capture Window",

WS_CHILD | WS_VISIBLE, 0, 0, 160, 120, (HWND) hWnd, (int) 0);


// Register the error callback function using the

// capSetCallbackOnError macro.

capSetCallbackOnError(ghWndCap, fpErrorCallback);


// Register the status callback function using the

// capSetCallbackOnStatus macro.

capSetCallbackOnStatus(ghWndCap, fpStatusCallback);


// Register the video-stream callback function using the

// capSetCallbackOnVideoStream macro.

capSetCallbackOnVideoStream(ghWndCap, fpVideoCallback);


// Register the frame callback function using the

// capSetCallbackOnFrame macro.

capSetCallbackOnFrame(ghWndCap, fpFrameCallback);


// Connect to a capture driver


break;

}

case WM_CLOSE:

{

// Use the capSetCallbackOnFrame macro to

// disable the frame callback. Similar calls exist for the other

// callback functions.


capSetCallbackOnFrame(hWndC, NULL);


break;

}


16.創(chuàng)建一個狀態(tài)回調函數(shù)(Creating a Status Callback Function)

??????????? 下面的例子是創(chuàng)建一個簡單的狀態(tài)回調函數(shù),登記此回調函數(shù)使用capSetCallbackOnStatus宏.


// StatusCallbackProc: status callback function

// hWnd: capture window handle

// nID: status code for the current status

// lpStatusText: status text string for the current status

//

LRESULT PASCAL StatusCallbackProc(HWND hWnd, int nID,

LPSTR lpStatusText)

{

if (!ghWndMain)

return FALSE;


if (nID == 0) { // Clear old status messages.

SetWindowText(ghWndMain, (LPSTR) gachAppName);

return (LRESULT) TRUE;

}

// Show the status ID and status text...

wsprintf(gachBuffer, "Status# %d: %s", nID, lpStatusText);


SetWindowText(ghWndMain, (LPSTR)gachBuffer);

return (LRESULT) TRUE;

}


17.創(chuàng)建一個錯誤回調函數(shù)( Creating an Error Callback Function)

???????????? 下面的例子是創(chuàng)建一個簡單的錯誤回調函數(shù),登記此回調函數(shù)使用capsetCallbackOnError宏:


// ErrorCallbackProc: error callback function

// hWnd: capture window handle

// nErrID: error code for the encountered error

// lpErrorText: error text string for the encountered error

//

LRESULT PASCAL ErrorCallbackProc(HWND hWnd, int nErrID,

LPSTR lpErrorText)

{

if (!ghWndMain)

return FALSE;


if (nErrID == 0) // Starting a new major function.

return TRUE; // Clear out old errors.


// Show the error identifier and text.

wsprintf(gachBuffer, "Error# %d", nErrID);


MessageBox(hWnd, lpErrorText, gachBuffer,

MB_OK | MB_ICONEXCLAMATION);


return (LRESULT) TRUE;

}


18.創(chuàng)建一個框架回調函數(shù)(Creating a Frame Callback Function)

????????????? 登記此回調函數(shù)使用capSetCallbackOnFrame宏:


// FrameCallbackProc: frame callback function

// hWnd: capture window handle

// lpVHdr: pointer to struct containing captured

// frame information

//

LRESULT PASCAL FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)

{

if (!ghWndMain)

return FALSE;


wsprintf(gachBuffer, "Preview frame# %ld ", gdwFrameNum++);

SetWindowText(ghWndMain, (LPSTR)gachBuffer);

return (LRESULT) TRUE

}


 

六.將四個標準對話框改成函數(shù)調用形式

????????????? 系統(tǒng)提供了四個標準的對話框:AudioFormat, VideoFormat, VideoSource, Video Compression,但有時程序希望通過函數(shù)控制它們,而不是使用系統(tǒng)提供的那個單一的對話框,此時就應該使用函數(shù)調用的方法:


AudioFormat對話框

??????????? 可以通過使用capSetAudioFormat來實現(xiàn),此時要使用WAVEFORMATEX結構。

例如:改成PCM格式,立體聲,16聲道,12.05kHz,則:

WAVEFORMATEX audioFormat;

// 確定寬度

acmMetrics(NULL, ACM_METRIC_MAX_SIZE_FORMAT,&dwSize);

dwSize = max (dwSize, capGetAudioFormatSize (m_hwCapCapturing));

// 設置參數(shù)

audioFormat.wFormatTag = WAVE_FORMAT_PCM;

audioFormat.nChannels = 2;

audioFormat.nSamplesPerSec = 120500;

audioFormat.wBitsPerSample =16;

audioFormat.nBlockAlign = nBitsPerSample * nChannels / 8;

audioFormat.nAvgBytesPerSec =

audioFormat.nBlockAlign * nSamplesPerSec;

// 更新

capSetAudioFormat(ghCapWnd,&audioFormat,dwSize);

VideoFormat對話框

????????????????? 可以通過使用capSetVideoFormat來實現(xiàn),此時要使用BITMAPINFOHEADER結構。

例如:設置圖片大小為RGB24位歲,大小為230X160

BITMAPINFOHEADER bi;

DWORD dwSize,dw;

bi.biSize = sizeof(BITMAPINFOHEADER);

bi.biWidth = 320; // 起作用

bi.biHeight = 160; // 起作用

bi.biPlanes = 1;

bi.biBitCount = 24;

bi.biCompression = BI_RGB;

bi.biSizeImage = 0;

bi.biXPelsPerMeter = 176;

bi.biYPelsPerMeter = 144;

bi.biClrUsed = 0;

bi.biClrImportant = 0;

dwSize = bi.biSize + ((bi.biBitCount > 8 || bi.biClrUsed) ? (bi.biClrUsed * sizeof(PALETTEENTRY)) : (2 ^ bi.biBitCount * sizeof(PALETTEENTRY)));

dw = capSetVideoFormat(m_hwCapCapturing, &bi, dwSize);

VideoSource對話框

??????????????? 沒有找到現(xiàn)成的方法,但視頻捕獲卡提供的CD里面有一個動態(tài)鏈接庫可以實現(xiàn)。

Video Compression對話框

???????????? 可以通過使用ICOpen,ICInfo等函數(shù)聯(lián)合起來,得到當前系統(tǒng)里面的視頻壓縮驅動的列表,并可選擇其一,MSDN里面有一個程序示范了此用戶,程序名叫:ICWalk。

總結

以上是生活随笔為你收集整理的[转]视频捕捉全教程(vc+vfw)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。