當前,在Windows 平臺下開(kāi)發(fā)視頻應用程序一般采用兩種方式:一種是基于視頻采集卡所附帶的二次軟件開(kāi)發(fā)包SDK(Software development kit)進(jìn)行。這種方式的優(yōu)點(diǎn)是應用方便,容易上手,缺點(diǎn)是對硬件的依賴(lài)性較強,靈活性差,且功能參差不齊,不能充分滿(mǎn)足各種視頻應用程序的開(kāi)發(fā)需要;
另一種方式是基于VFW(Video for Windows)進(jìn)行的。VFW 是Microsoft公司為開(kāi)發(fā)Windows平臺下的視頻應用程序提供的軟件工具包,提供了一系列應用程序編程接口(API),用戶(hù)可以通過(guò)它們很方便地實(shí)現視頻捕獲[1]、視頻編輯及視頻播放等通用功能,還可利用回調函數開(kāi)發(fā)更復雜的視頻應用程序。它的特點(diǎn)是播放視頻時(shí)不需要專(zhuān)用的硬件設備,而且應用靈活,可以滿(mǎn)足視頻應用程序開(kāi)發(fā)的需要。Windows操作系統自身就攜帶了VFW,系統安裝時(shí),會(huì )自動(dòng)安裝VFW的相關(guān)組件。VC++自4.0以來(lái)就支持VFW,大大簡(jiǎn)化了視頻應用程序的開(kāi)發(fā)。目前,PC機上多媒體應用程序的視頻部分,大都是利用VFW API開(kāi)發(fā)的。
1 VFW 的體系結構
VFW以消息驅動(dòng)方式對視頻設備進(jìn)行存取,可以很方便地控制設備數據流的工作過(guò)程。目前,大多數的視頻采集卡驅動(dòng)程序都支持VFW接口,它主要包括多個(gè)動(dòng)態(tài)連接庫,通過(guò)這些組件間的協(xié)調合作,來(lái)完成視頻的捕獲、視頻壓縮及播放功能。VFW體系結構如圖1所示。
1)VICAP.DLL:主要實(shí)現視頻捕獲功能,包含了用于視頻捕獲的函數,為音像交錯AVI (Audio video interleaved)格式文件和視頻、音頻設備程序提供一個(gè)高級接口。
2)MSVIDEO.DLL:能夠將視頻捕獲窗口與獲驅動(dòng)設備連接起來(lái),支持ICM視頻編碼服務(wù)。
3)MCIAVI.DRV:包含MCI(Media control interface)命令解釋器,實(shí)現回放功能。
4)AVIFILE.DLL:提供對AVI文件的讀寫(xiě)操作等文件管理功能。
5)ICM ( Installable compression manager ):即壓縮管理器,提供對存儲在AVI文件中視頻圖像數據的壓縮、解壓縮服務(wù)。
6)ACM ( Audio Compression Manager ):即音頻壓縮管理器,提供實(shí)時(shí)音頻壓縮及解壓縮功能。
2 視頻捕獲
視頻數據的實(shí)時(shí)采集,主要通過(guò)AVICAP模塊中的消息、宏函數、結構以及回調函數來(lái)完成。視頻捕獲的一般過(guò)程如下:
2.1 建立捕獲窗口
利用AVICAP 組件函數 capCreateCaptureWindow() 建立視頻捕獲窗口,它是所有捕獲工作及設置的基礎,其主要功能包括:① 動(dòng)態(tài)地同視頻和音頻輸入器連接或斷開(kāi);② 設置視頻捕獲速率;③ 提供視頻源、視頻格式以及是否采用視頻壓縮的對話(huà)框;④ 設置視頻采集的顯示模式為Overlay或為Preview; ⑤ 實(shí)時(shí)獲取每一幀視頻數據;⑥ 將一視頻流和音頻流捕獲并保存到一個(gè)AVI文件中; ⑦ 捕獲某一幀數字視頻數據,并將單幀圖像以DIB格式保存;⑧ 指定捕獲數據的文件名,并能將捕獲的內容拷貝到另一文件。
2.2 登記回調函數[2]
登記回調函數用來(lái)實(shí)現用戶(hù)的一些特殊需要。在以一些實(shí)時(shí)監控系統或視頻會(huì )議系統中,需要將數據流在寫(xiě)入磁盤(pán)以前就必須加以處理,達到實(shí)時(shí)功效。應用程序可用捕獲窗來(lái)登記回調函數,以便及時(shí)處理以下情況:捕獲窗狀態(tài)改變、出錯、使用視頻或音頻緩存、放棄控制權等,相應的回調函數分別為 capStatusCallback(), capErrorCallback(), capVideoStreamCallback(), capWaveStreamCallback(),capYieldCallback()。
2.3 獲取捕獲窗口的缺省設置
通過(guò)宏capCaptureGetSetup(hWndCap,&m_Parms,sizeof(m_Parms))來(lái)完成。
2.4 設置捕獲窗口的相關(guān)參數
通過(guò)宏capCaptureSetSetup(hWndCap,&m_Parms,sizeof(m_Parms))來(lái)完成。
2.5 連接捕獲窗口與視頻捕獲卡
通過(guò)宏capDriveConnect(hWndCap,0)來(lái)完成。
2.6 獲取采集設備的功能和狀態(tài)
通過(guò)宏capDriverGetCaps(hWndCap,&m_CapDrvCap,sizeof(CAPDRIVERCAPS))來(lái)獲取
視頻設備的能力,通過(guò)宏capGetStatus(hWndCap,&m_CapStatus,sizeof(m_CapStatus))
來(lái)獲取視頻設備的狀態(tài)。
2.7 設置捕獲窗口顯示模式
視頻顯示有Overlay(疊加)和Preview(預覽)兩種模式。在疊加模式下,捕獲視頻數據布展系統資源,顯示速度快,視頻采集格式為YUV格式,可通過(guò)capOverlay(hWndCap,TRUE)來(lái)設置;預覽模式下要占用系統資源,視頻由系統調用GDI函數在捕獲窗顯示,顯示速度慢,它支持RGB視頻格式。
2.8 捕獲圖像到緩存或文件并作相應處理
若要對采集數據進(jìn)行實(shí)時(shí)處理,則應利用回調機制,由capSetCallbackOnFrame(hWndCap, FrameCall-
backProc)完成單幀視頻采集;由capSetCallbackOnVideoStream(hWndCap, VideoCallbackProc)完成視頻流采集。如果要保存采集數據,則可調用capCaptureSequence(hWnd);要指定文件名,可調用capFileSetCap-
ture(hwnd, Filename)。
2.9 終止視頻捕獲 斷開(kāi)與視頻采集設備的連接
調用capCatureStop(hWndCap)停止采集,調用capDriverDisconnect(hWndCap), 斷開(kāi)視頻窗口與捕獲驅動(dòng)程序的連接。
3 視頻編輯和播放
利用VFW,不僅可以實(shí)現視頻流的實(shí)時(shí)采集,還提供了編輯和播放功能,主要通過(guò)AVIFILE、ICM、ACM、MCIWnd 等組件之間的協(xié)作來(lái)完成。
1) AVIFileInit();//初始化;
2) AVIFileOpen(); //打開(kāi)一個(gè)AVI文件并獲文件的句柄;
3) AVIFileInfo(); //獲取文件的相關(guān)信息,如圖像的Width和Height等;
4) AVIFileGetStream(); //建立一個(gè)指向需要訪(fǎng)問(wèn)的數據流的指針;
5) AVIStreamInfo(); //獲取存儲數據流信息的AVISTREAMINFO結構;
6) AVIStreamRead(); //讀取數據流中的原始數據, 對AVI文件進(jìn)行所需的編輯處理;
7) AVIStreamRelease(); //釋放指向視頻流的指針;
8) AVIFileRelease();AVIFileExit(); //釋放AVI文件。
若數據是壓縮過(guò)的,則用AVIStreamGetFrameOpen(),AVIStreamGetFrame()和AVIStreamGetFrameClose()來(lái)操作,可以完成對視頻流的逐幀分解。
3.2 視頻播放
對于實(shí)現視頻流的播放,VFW提供了MCIWnd窗口類(lèi)[4],主要用于創(chuàng )建視頻播放區,控制并修改MCI窗口當前加載媒體的屬性。一個(gè)由函數、消息和宏組成的庫與MCIWnd相關(guān)聯(lián),通過(guò)它們可以進(jìn)行AVI文件操作,很方便地使應用程序完成視頻播放功能。
1)MCIWndCreate(); //注冊MCIWnd窗口類(lèi),創(chuàng )建MCIWnd窗口,并指定窗口風(fēng)格;
2)AVIFileInit(); //初始化;
3) AVIFileOpen(); //打開(kāi)AVI文件;
4) AVIFileGetStream(); //獲得視頻流;
5)運用相關(guān)函數進(jìn)行各種播放任務(wù):MCIWndPlay()正向播放AVI文件內容,MCIWndPlayReverse()反向播放,MCIWndResume() 恢復播放,MCIWndPlayPause()暫停播放,MCIWndStop()停止播放等等。
6) AVIStreamRelease(); //釋放視頻流;
7)AVIFileRease();AVIFileExit(); //斷開(kāi)與AVI文件的連接,釋放視頻源。
由以上步驟可以看出,視頻播放是視頻編輯其中的一種操作。
4 結束語(yǔ)
隨著(zhù)社會(huì )的發(fā)展,人們對多媒體技術(shù)的需求也越來(lái)越高,已經(jīng)不滿(mǎn)足單一的通信功能,要求影像與聲音的同步服務(wù),如可視電話(huà)、視頻會(huì )議、各種實(shí)時(shí)監控系統、報警系統等,而數字視頻技術(shù)則是多媒體技術(shù)的核心之一。微軟推出的數字視頻處理軟件開(kāi)發(fā)包Video for Windows,將開(kāi)發(fā)者從硬件的底層束縛中解放出來(lái),大大簡(jiǎn)化了數字視頻捕獲這一原本很復雜的工作,利用它可以很方便的將模擬視頻信號數字化,并支持進(jìn)一步處理和播放,為開(kāi)發(fā)實(shí)時(shí)視頻應用程序開(kāi)辟了道路。
參考文獻:
[1] 周長(cháng)發(fā). VC++多媒體編程技術(shù)與實(shí)例[M]. 北京:電子工業(yè)出版社, 1999.
[2] 張星明. 視頻圖像捕獲及運動(dòng)檢測技術(shù)的實(shí)現[J]. 計算機工程, 2002, 28(8):130-132.
[3] 肖永隆,王 理. 利用VFW庫函數快速分解AVI數據流[J]. 信息工程大學(xué)學(xué)報, 2001, 2(3):39-42.
[4] 喻其炳. 多媒體信息處理在Windows中的應用[J]. 重慶工商大學(xué)學(xué)報, 2003, 20(1):64-66.
聯(lián)系客服