王瑜
摘要:在VB中分析視頻捕捉的工作流程,依托VFW軟件開發(fā)包的體系結(jié)構(gòu),通過調(diào)用Windows API函數(shù),來(lái)設(shè)計(jì)和實(shí)現(xiàn)局域網(wǎng)內(nèi)視頻捕捉程序,并給出部分源代碼,重點(diǎn)討論了VB對(duì)VFW視頻捕捉的設(shè)計(jì)方法及關(guān)鍵性Windows API函數(shù)的用法。
關(guān)鍵詞:VB;VFW;視頻捕捉;Windows API
中圖分類號(hào):TP37 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)31-0174-02
In the VB based on VFW Video Capture Technology
WANG Yu
(Yunyang Teacher's College, Shiyan 442000, China)
Abstract: In the VB analysis of video capture workflow, relying on VFW architecture of the software development kit by calling the Windows API functions, to design and implement LAN video capture program, and give part of the source code, focusing on the VB to the VFW video capture The design methods and critical use of Windows API functions.
Keywords: VB; VFW; Video Capture; Windows API
在各類的通訊手段與科學(xué)技術(shù)乃至多媒體的終端技術(shù)不斷發(fā)展的當(dāng)下,對(duì)于多媒體的應(yīng)用尤其是視頻方面的應(yīng)用,在很大程度上取得了優(yōu)越的進(jìn)展,許多關(guān)于視頻的軟件開發(fā),如視頻會(huì)議、可視手機(jī)等都是基于視頻捕獲技術(shù)而發(fā)展壯大,這得益于Microsoft公司于1992年在Windows系統(tǒng)中提供的視頻捕獲標(biāo)準(zhǔn)接口Video for Windows(VFW)。VFW的核心是AVI文件標(biāo)準(zhǔn),其SDK分VC和VB版。在客戶對(duì)Windows的系統(tǒng)進(jìn)行安裝的過程當(dāng)中,整個(gè)程序會(huì)根據(jù)事先設(shè)定的程序內(nèi)容,自動(dòng)地將整個(gè)系統(tǒng)當(dāng)中所需要的相關(guān)視頻方面的組件進(jìn)行配置安裝,VFW的開發(fā)工具提供了各類音視頻服務(wù)的接口和函數(shù),這些函數(shù)允許應(yīng)用程序與各類音視頻驅(qū)動(dòng)程序之間相互通信,極大的簡(jiǎn)化視頻捕獲過程的編程。
1 Video for Windows(VFW)簡(jiǎn)介
1.1 VFW技術(shù)概述
VFW的基礎(chǔ)是MCI(Media Control Interface,媒體控制接口)。MCI本身提供高、中、低三種層次接口。高層接口主要提供Avicap和Mciwnd這兩個(gè)類型的系統(tǒng)窗口,主要是通過VFW當(dāng)中的兩個(gè)動(dòng)態(tài)的相應(yīng)的鏈接倉(cāng)庫(kù)進(jìn)行的創(chuàng)建,分別命名為Avicap.dll以及Msvedeo.dll,分別用于采集捕捉視頻剪輯和播放音視頻文件。中層接口主要負(fù)責(zé)應(yīng)用程序與各多媒體驅(qū)動(dòng)程序相連接。其中的低層次的接口,是在對(duì)程序的基本要求全面熟知的情況下,將多媒體的信息設(shè)備進(jìn)行全面的分析與應(yīng)用,在對(duì)多媒體的相關(guān)信息進(jìn)行全面的接管的過程當(dāng)中所采用的技術(shù)手段。具有很強(qiáng)的實(shí)時(shí)性。
VFW這一技術(shù),主要是由六大方面的模塊進(jìn)行組件而成:
1)AVICAP.DLL:這一模塊,主要講視頻的捕獲功能予以全面的實(shí)現(xiàn),其中包含的一些函數(shù),可以用作是視頻的捕捉與獲取,從而為相應(yīng)的視頻與音頻提供接收的有效端口。
2)MSVIDEO.DLL:這個(gè)模塊,主要功能作用是將相應(yīng)的捕捉與獲取視頻的窗口,智能地域其相關(guān)聯(lián)的驅(qū)動(dòng)設(shè)備進(jìn)行連接,從而在最大程度上對(duì)ICM的視頻當(dāng)中編碼程序進(jìn)行全方位的服務(wù)。
3)其模塊含有MCI的命令,并且配備了命令相應(yīng)的解釋器具,可以在很大程度上將回放的功能實(shí)現(xiàn)。
4)MCIAVI.DRV:這個(gè)模塊極為特殊,它可以對(duì)AVI的文件予以管理,針對(duì)其讀寫與操作的性能,進(jìn)行文件的統(tǒng)一管理。
5)ICM:被稱之為壓縮的管理器具,它可以為存儲(chǔ)在AVI的文件當(dāng)中一系列的視頻相關(guān)的圖像與數(shù)據(jù)進(jìn)行壓縮,同時(shí)也提供了解壓縮的這項(xiàng)服務(wù)。
6)ACM:是處理音頻的主要模塊,將音頻進(jìn)行壓縮與管理的器具,提供實(shí)時(shí)音頻壓縮及解壓縮功能。
2 在CFW整體技術(shù)的基礎(chǔ)上,將VB當(dāng)中視頻的獲取與捕捉的工作流程予以實(shí)現(xiàn)
2.1 視頻捕捉工作流程
1)創(chuàng)建視頻捕獲窗口:Declare Function capCreateCaptureWindow Lib "avicap32.dll" _Alias "capCreateCaptureWindowA" _(Byval lpszWindowName As string,_Byval dwStyle As Long,_Byval x As Long,_Bycal y As Long,_Byval nWidth As Long,_Byval nHeight As Long,_Byval hwndParent As Long,_Byval nID As Long) As Long其中l(wèi)pszWindowName表示窗口名稱;x,y,nWidth,nHeight表示窗口位置大小。
2)注冊(cè)系統(tǒng)回調(diào)函數(shù):在其中進(jìn)行了多個(gè)函數(shù)的定義,當(dāng)相應(yīng)的事件發(fā)生的時(shí)候,會(huì)通過系統(tǒng)進(jìn)行整體的操作與調(diào)試。
3)設(shè)置捕獲窗口相關(guān)函數(shù):根據(jù)實(shí)際情況來(lái)修改其返回值中各變量的相應(yīng)信息,從而獲取更多的視頻捕獲的方式方法。
4)枚舉視頻采集設(shè)備并進(jìn)行連接:查找系統(tǒng)中可用的視頻采集設(shè)備,用函數(shù):Declare Function capGetDriverDescription Lib "avicap32.dll" _Alias "capGetDriverDescriptionA" _(Byval dwDriverIndex As Long,_Byval lpszName As string,_Byval cbName As Long,_Bycal lpszVer As string,_Byval cbVer As Long) As Long來(lái)得到已安裝捕捉設(shè)備的名稱和版本號(hào),并用宏capDriverConnect將捕獲窗口與采集設(shè)備連接起來(lái)。
5)獲取視頻并且將相關(guān)的設(shè)備所持有的能力以及信息內(nèi)容進(jìn)行全面的采集:通過宏調(diào)配capDriverGetCaps并且對(duì)設(shè)備所擁有的能力進(jìn)行采收與集整的一種狀態(tài)。
6)對(duì)設(shè)備的窗口進(jìn)行捕捉與獲取,從而進(jìn)行顯示的模式:通過fHasOverlay域判斷視頻設(shè)備能力,通過capOverlay啟動(dòng)疊加(Overlay)模式,或通過capPreview啟動(dòng)預(yù)覽(Preview)模式。并可通過函數(shù):Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long對(duì)系統(tǒng)進(jìn)行通知,并且告知CFW所需要的工作內(nèi)容。
7)捕捉視頻到緩存或文件并進(jìn)行處理:可用函數(shù)capSetCallBackOnFrame對(duì)視頻進(jìn)行逐幀處理,也可用宏capCaptureSequence將捕獲視頻以AVI格式進(jìn)行保存。
8)完成視頻的捕捉工作,并且將其終止,將于視頻捕捉與獲取的相關(guān)設(shè)備之間的有效連接進(jìn)行中斷處理:在結(jié)束了捕獲的工作之后,將其他的后續(xù)工作完成,其中包括捕獲工作的終止、回調(diào)的函數(shù)的取消、內(nèi)存的釋放以及設(shè)備連接的斷開等。
2.2 視頻捕捉的設(shè)計(jì)與實(shí)現(xiàn)
VB在支持VFW方面提供了強(qiáng)大的窗口類Avicap,可直接控制視頻源,不僅支持實(shí)時(shí)的視頻流和單幀捕獲,還可以直接訪問視頻緩沖區(qū),不需要生成中間文件。下面給出部分VB捕捉具體程序代碼:
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _Alias "capCreateCaptureWindowA" ( _ByVal lpszWindowName As String, _ByVal dwStyle As Long, _ByVal x As Long, _ByVal y As Long, _ByVal nWidth As Long, _ByVal nHeight As Long, _ByVal hWndParent As Long, _ByVal nID As Long) As Long
……
Private Declare Function SendMessage Lib "user32" _Alias "SendMessageA" ( _ByVal hwnd As Long, _ByVal wMsg As Long, _ByVal wParam As Long, _lParam As Any) As Long
……
Private Sub Form_Load()
Preview_Handle = capCreateCaptureWindow("Video", WS_CHILD + WS_VISIBLE, 0, 0, 320, 240,Me.hWnd, 1) '將捕捉與獲取的相應(yīng)窗口進(jìn)行建立
SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 0, 0 '將捕捉與獲取窗口與設(shè)備的連接鏈進(jìn)行建立
SendMessage Preview_Handle, WM_CAP_SET_PREVIEWRATE, 30, 0 '將幀頻率為30毫秒一幀進(jìn)行捕捉與設(shè)置
SendMessage Preview_Handle, WM_CAP_SET_PREVIEW, 1, 0 '通過全面預(yù)覽的方式,在整體捕獲的窗口進(jìn)行圖像的預(yù)覽工作
End Sub
Private Sub Form_Unload(Cancel As Integer)
SendMessage Preview_Handle, WM_CAP_DRIVER_DISCONNECT, 0, 0 '將其從捕捉與獲取的設(shè)備中的連接進(jìn)行中斷
End Sub
以上程序在Windows XP、VB6.0下編譯通過,視頻捕捉情況良好,同時(shí)也可將捕捉下來(lái)的視頻用Avifile進(jìn)行存盤操作,但由于文件占用空間一般較大,如果需要進(jìn)行網(wǎng)絡(luò)傳輸,則需編寫相應(yīng)的壓縮代碼進(jìn)行壓縮后才能執(zhí)行。
3 結(jié)束語(yǔ)
VFW技術(shù)封裝了有關(guān)視頻捕捉的API函數(shù),在VB中可由這些接口編程通過視頻捕捉硬件獲取數(shù)據(jù),將開發(fā)者從硬件的底層束縛中解放出來(lái),極大地簡(jiǎn)化了視頻捕獲過程,代碼簡(jiǎn)單易讀,應(yīng)用性廣,將對(duì)進(jìn)一步的處理工作以及播放工作予以大力的支持,從而能夠?qū)⒁曨l的應(yīng)用程序不斷推廣,最終開辟出全新的道路。
參考文獻(xiàn):
[1] Jeff Prosise(美). MFC Windows程序設(shè)計(jì)[M]. 清華大學(xué)出版社, 2002.
[2] 王汝言. 多媒體通信技術(shù)[M]. 西安電子科技大學(xué)出版社, 2004.
[3] 曹衍龍. Visual Basic系統(tǒng)開發(fā)實(shí)例精粹[M]. 人民郵電出版社, 2005.