基於VFW的USB攝像頭視頻捕獲的研究(資料收集)(一)

    1、視頻捕獲

    Windows的AVICap類可以輕鬆地完成視頻捕獲,AVICap提供給應用程序一個簡單的,基於消息的接口去訪問視頻設備和錄音設備,並且可以控制處理視頻流捕獲。

   1.1 關於視頻捕獲

    AVICap支持實時視頻流捕獲和單幀圖像捕獲,另外,AVICap提供了對視頻源的控制(MCI媒體控制接口設備),因此使用者可以通過應用程序控制一個視頻源開始和結束的位置,並且可以加大對幀捕獲的控制。使用AVICap類可以完成如下任務:

    1)捕獲聲音和視頻,並將他們寫入到一個AVI文件中。

    2)指定一個文件用於捕獲,並且把這個捕獲文件的內容拷貝給另一個文件。

    3)設定捕獲圖像速度。

    4)顯示對話框用於控制視頻源和格式。

    5)創建、保存、加載調色板。

    6)拷貝圖像和調色板到剪切板中。

    7)捕獲並把圖像作爲一個DIB位圖保存。、

視頻捕獲將數字化一個視頻流和音頻數據,並且將他們保存在硬盤和其他存儲設備上。

下面例子介紹一個簡單的視頻捕獲案例:

AVICap捕獲窗口可以把捕獲的音頻視頻信息寫入到一個AVI文件中,你的應用程序可以自由地處理這個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,0L);

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

 

宏接口同樣有用,你可以選擇是使用宏接口還是SendMessage函數來實現上述功能,不過宏接口可以讓你的代碼更加容易理解,下面就是使用了宏接口。

HWndC = capCreateCaptureWindow("My Window Name",WS_CHILD|WS_VISIBLE,0,0,160,120,hWndParent,nID);

capDriverConnect(hWndC,0);

capCaptureSequence(hWndC);

你的應用程序創建AVICap捕獲窗口,並和視頻設備建立連接後,你創建的這個捕獲窗口就準備捕獲數據了,這個,你可以通過發送WM_CAP_SEQUENCE消息(CapCaptureSequence宏)開始對數據進行捕獲。

WM_CAP_SEQUENCE將使用默認設置,開始對視頻和音頻進行捕獲,並把數據放在一個CAPTURE.AVI的文件中,捕獲動作將一直持續,除非有下面的事件發生:

1)用戶按裏ESC鍵或者鼠標的按鈕;

2)你的應用程序停止或者退出了捕獲操作;

3)磁盤寫滿了。

在應用程序中,你可以通過發送WM_CAP_STOP命令(capCaptureStop)給捕獲窗口,讓它停止向文件寫數據,你可以通過發送WM_CAP_ABORT命令(capCaptureAbort)給捕獲窗口,讓它中段捕獲操作。

1.1.2捕獲的基本設置

通過對定義在CAPTUREPARMS結構中的捕獲參數進行修改,可以:

1)改變捕獲的幀頻率(幀/秒);

2)指定用鍵盤或鼠標去結束一個捕獲會話;

3)爲一個捕獲會話指定時間週期。

 

捕獲的幀頻率表示在一個捕獲會話中,每秒要捕獲多少幀,可以通過WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup宏)可以得到當前捕獲的幀頻率,當前的幀頻率被保存在CAPTUREPARMS結構的dwRequestMicroSecPerFrame成員中,你尅對其進行修改,從而改變幀頻率。該值爲捕獲一幀需要的時間(單位爲1/1000000秒)修改後,可以發送WM_CAP_SEQUENCE_SETIP消息(capCaptureSetup宏)給你的捕獲窗體,來刷新CAPTUREPARMS結構。dwRequestMicroSecPerFrame默認值是66667微秒,表示每秒15幀。

退出數據捕獲的方法有:按鍵盤上的一個鍵或幾個組合鍵,或這按鼠標的左鍵或者右鍵,如果用戶退出一個實體的捕獲會話,那麼捕獲文件中的內容將被系統丟棄掉。如果用戶退出一個步幀(step-Frame)捕獲的會話,捕獲文件將保存到退出時刻前的所有數據。

你可以通過發WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup)給捕獲窗口,來獲得捕獲退出的設置信息,當前的拖出按鈕設置保存在CAPTUREPARMS結構的vKeyAbort成員中,當前的退出鼠標設置保存在fAbortLeftMouse和fAbortRightMouse成員中,你可以改變這個成員,實現對當前值的修改,當你修改完成後,你可以發送WM_CAP_SET_SEQUENCE_SETUP消息(capCaptureSetSetup)給你的捕獲窗體,來刷新CAPTUREPARMS結構。

vKeyAbort默認值是VK_ESCAPE。在重新指定其他按鍵前,你必須調用RegisterHotKey函數。fAbortLeftMouse和fAbortRightMouse是TRUE。

時間限定:

通過使用CAPTUREPARMS結構的fLimitEnabled和wTimeLimit成員,你可以去限定一個捕獲操作的時間週期,fLimitEnabled表示是否要對捕獲操作限定時間,wTimeLimit用於限定時間的最大值。

你發WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup)給捕獲窗口,就可以得到fLimitEnabled和wTimeLimit的值。fLimitEnabled爲TRUE表示要指定時間週期。wTimeLimit單位爲秒,修改完成後,你可以發送WM_CAP_SET_SEQUENCE_SETUP消息(capCaptureSetSetup)給你的捕獲窗體,來刷新CAPTUREPARMS結構。fLimitEnabled默認值爲FALSE

1.1.3捕獲窗口

捕獲窗口一般使用WS_CHILD和WS_VISIBLE窗口類型,類似於一個標準控件。

創建一個捕獲窗口:

使用capCreateCaptureWindow函數可以創建一個AVICap的捕獲窗口,這個函數返回一個窗口句柄,這個句柄就是捕獲窗口的句柄,後面其他操作就是通過發送消息給該句柄來實現,可在一個程序中創建多個捕獲窗口,並且每個窗口連接到不同的捕獲設備上。

建立捕獲窗口到捕獲設備的連接:

你可以動態滴連接或斷開捕獲窗口與設備間的連接,可以使用WM_CAP_DRIVER_CONNECT消息(capDriverConnect),可以實現捕獲窗體與設備驅動間的連接,當捕獲窗體與捕獲設備驅動連接後,你就可以發送針對設備的消息給該窗體了。

如果你的系統安裝了多個捕獲設備,你可以通過在發送WM_CAP_DRIVER_CONNECT消息時,設置wPrarm參數(integer)。來指定捕獲窗口與哪個具體的視頻捕獲設備相連接。wPrarm參數是一個證書,表示一個系統已經安裝的視頻捕獲設備列表的索引(註冊表中或System.ini[drivers]中的信息),該列表的索引從0開始。

通過capGetDriverDescription函數可以獲得安裝的捕獲驅動程序的名稱和版本,你的應用程序可以使用這個函數列舉除安裝的所有捕獲設備,讓用戶可以選擇其中一個去與捕獲窗口相連。

通過發送WM_CAP_DRIVER_DISCONNECT消息(capDriverGetDisconnect宏),你可以斷開連接,當捕獲窗口銷燬後,任何連接的視頻捕獲設備都將自動斷開。

父子窗體交互:

一些系統級的消息,比如WM_PALETTECHANGED、WM_QUERYNEWPALETTE,只被發送到頂層和overlapped窗口,如果一個捕獲窗體是一個子窗體,那他的父窗口應該來轉寄這些消息。

捕獲窗體狀態:

通過發送WM_CAP_GET_STATUS消息(capGetStatus),可以獲得當前捕獲窗口的狀態,這個消息得到一個CAPSTATUS結構體的拷貝,狀態信息就在這個結構體的成員中。CAPSTATUS結構體包含了圖形尺寸大小,滾動位置,是否覆蓋或者預覽等信息,因爲在CAPSTATUS中的信息是動態的,你的應用程序應該隨時去刷新這個結構體中的內容。

1.1.4捕獲和音頻驅動器

視頻捕獲可以做這幾個方面的工作:訪問視頻源,顯示選項,格式和壓縮選項,音頻捕獲包括指定音頻格式個選擇壓縮方式。

捕獲驅動性能:

通過發送WM_CAO_DRIVER_GET_CAPS消息(capDriverGetCaps)可以得到當前連接的捕獲設備的性能,發送該消息後,會返回一個CAPDRIVERCAPS結構的對象,設備的性能信息就在這個對象中。

視頻對話框:

每個捕獲設備的驅動程序都可以爲控制視頻信號和捕獲處理和視頻壓縮提供4個對話框,這些對話框中的內容都是視頻捕獲驅動程序定義的。

視頻源對話框用於選擇視頻輸入通道和視頻圖像的動態參數,它可以列舉出當前連接視頻設備的信號類型(SVHS和複合類型),並且可以通過該對話框去修改圖像的色調、亮度、飽和度。你可以通過使用WM_CAP_DLG_VIDEOSOURCE消息(capDlgVideoSource)來顯示和刷新這個窗口。

視頻格式對話框用於選擇數字視頻的框架大小和視頻圖像的色深,以及捕獲視頻圖像的壓縮格式,你可以通過使用WM_CAP_DLG_VIDEOFORMAT消息或(capDlgVideoFormat)來顯示和刷新這個窗口。

視頻顯示對話框用於控制視頻外觀,在該對話框上進行了修改只是對視頻顯示起作用,對於實際的視頻數據是不會造成改變的,比如,可以改變顯示的顏色,飽和度,你可以使用WM_CAP_DLG_VIDEODISPALY消息(capDlgVideoDispaly)來顯示和刷新這個窗口。

視頻壓縮對話框(Video Compression Dialog box)用於設置視頻壓縮的格式,通過使用WM_CAP_DLG_VIDEOCOMPRESSION消息(capDlgVideoCompression)來顯示和刷新這個窗口。

預覽和覆蓋模式(Preview and Overlay):

一般,一個捕獲驅動提供兩種方式來觀看輸入的視頻流:預覽模式和覆蓋模式,如果捕獲驅動可以提供上面兩種模式,那麼用戶就可以選擇其中的模式來使用。

預覽模式從捕獲設備硬件傳輸數據幀到系統的內存中,並且在捕獲窗口中使用GDI函數來顯示這些數據幀,當捕獲窗口的父窗體失去焦點的時候,在應用程序的視頻預覽的數據將變慢,如果父窗體獲得焦點後,將對預覽顯示進行加速,因爲預覽處理的這個處理方式將大大提高整個系統的效率。

1)WM_CAP_SET_PREVIEW消息(capPreview)可以打開或關閉預覽模式;

2)WM_CAP_SET_PREVIEWRATE(capPreviewRate)可以設置預覽模式下圖像的幀速;

3)WM_CAP_SET_SCALE消息(capPreviewScale)打開或者關閉預覽視頻的縮放比例。

當預覽和縮放比例屬性都打開後,那麼視頻將被縮放到和捕獲窗口尺寸一樣大,打開預覽模式後,系統將自動關閉覆蓋模式。

覆蓋模式:不佔用CPU的處理資源,直接在顯示器上顯示視頻內容,所用的處理是有捕獲設備硬件來完成,發送WM_CAP_SET_OVERLAY消息(capOverlay)給捕獲窗口,可以打開覆蓋模式。無論是預覽模式還是覆蓋模式,都可以通過發送WM_CAP_SETSCROLL消息(capSetScrollPos)可以設置圖像的在整個視頻幀的滾動位置。

視頻格式:

     通過發送WM_CAP_GET_VIDEOFORMAT消息(capGetVideoFormat)給視頻捕獲窗口可以得到一個結構,在這個結構中就包含了視頻的格式、大小。通過發送WM_CAP_SET_VIDEOFORMAT消息(capSetVideoForma)t給視頻捕獲窗口可以對視頻格式進行修改設置。

視頻捕獲設置:

CAPUREPARMS數據結構包含了視頻流的控制參數,它允許完成如下任務:

1)指定幀速;

2)指定爲視頻分配的緩存大小;

3)關閉或打開視頻捕獲;

4)設定捕獲的時間間隔;

5)指定捕獲設備;

6)指定鍵盤或鼠標去控制結束捕獲;

7)指定適用的視頻類型。

1.1.5捕獲文件和緩存區

捕獲文件名,AVICap默認,把視頻數據從捕獲窗口保存到當前驅動的根目錄下,文件名爲CAPTURE.AVI,發送WM_CAP_FILE_SET_CAPTURE_FILE消息(capFileSetCaptureFile)給捕獲窗體,可以改變保存的文件名,這個消息指定文件名:它不創建文件,分配空間,也不能打開文件,通過發送WM_CAP_FILE_GET_CAPTURE_FILE消息(capFileGetCaptureFile)給捕獲窗口,得到當前文件名。

保存捕獲數據到一個新文件:

如果用戶想保存捕獲數據,把數據存到另一個文件中,可以使用WM_CAP_FILE_SAVES消息(capFileSaveAs),這個消息不能改變捕獲文件的名稱和內容,你必須去指定新建的文件名,因爲捕獲文件將保留原來的文件名稱。

爲捕獲文件預分配磁盤空間:

在捕獲操作前,先在磁盤上爲捕獲文件建一個指定大小的文件,預分配空間將減少數據保存的處理時間,可以通過WM_CAP_FILE_ALLOCCATE消息(capFILEAlloc)來預分配一個捕獲文件。

3.1.6捕獲變化

除了對基於持續時間間隔的流捕獲外,AVICap還支持如下的捕獲:

1)手控制幀捕獲

2)Still—image捕獲

3)不使用磁盤存儲的捕獲

4)從一個MCI設備的流捕獲。

如果你想指定捕獲視頻流中的個別幀,你可以通過WM_CAP_SINGLE_FRAME_OPEN消息、WM_CAP_SINGLE_FRAME消息、WM_CAP_SINGLE_FRAME_CLOSE消息來控制幀序列。

典型應用是,這些消息用於向捕獲文件添加單獨的幀來創建一個動畫,WM_CAP_SINGLE_OPEN爲手動捕獲操作打開一個文件,WM_CAP_SINGLE_FRAME 用於捕獲一個單獨的幀放在文件中。WM_CAP_SINGLE_FRAME_CLOSE用於關閉這個捕獲文件。

Still_Image捕獲:

如果要捕獲一個單獨的幀作爲一個靜態圖像,你可以使用WM_CAP_GRAB_FRAME_NOSTOP或WM_CAP_FRAB_FRAME(capGrabFrameNoStop或capGrabFrame)在一個幀緩存區中捕獲一個圖像,你可以通過使用下面的消息來抓獲當前顯示的圖像WM_CAP_GRAB_FRAME,否則,使用WM_CAP_GRAB_FRAME_NOSTOP。

一旦開始捕獲,你可以拷貝圖像給其他應用程序,你可以從幀緩存區拷貝一個圖像到剪切板(使用WM_CAP_EDIT_COPY capEditCopy)你還可以使用如下消息,將緩存區的一張圖像拷貝到一個DIB位圖中(WM_CAP_FILE_SAVEDIB capFileSaveDIB)

不使用磁盤存儲的捕獲:

使用WM_CAP_SEQUENCE_NOFILE(capCaptureSequenceNoFile)可以不向磁盤文件寫入數據,該消息僅在配合回調函數時有用,它允許你的應用程序直接使用音視頻數據。

 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章