一 視頻采集及回放
我采用VFW實現視頻采集。VFW以消息驅動方式對視頻設備進行存取,可以很方便地控制設備數據流的工作過程。目前,大多數的視頻采集卡驅動程序都支持VFW接口,它主要包括多個動態連接庫,通過這些組件間的協調合作,來完成視頻的捕獲、視頻壓縮及播放功能。視頻數據的實時采集,主要通過AVICAP模塊中的消息、宏函數、結構以及回調函數來完成。下面我主要敘述通過宏函數來完成的采集過程,每一個宏函數實現的功能都可以用相應的消息機制來實現,具體msdn裡講得很清楚了。
(一)創建捕獲窗口:
m_capwnd=
capCreateCaptureWindow("Capture",WS_POPUP,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0);
在視頻捕獲之前需要創建一個捕獲窗,所有的捕獲操作及其設置都以它為基礎。 這裡有8個參數。參數1是捕獲窗口的名字,隨便給一個什麼都行,後面也沒有引用到,不知道有什麼用(問題1)?。參數2設置捕獲窗口類型。參數3,4,5,6分別設置捕獲窗左上角坐標和窗體寬度和高度。捕獲窗口相當於MFC的一個捕獲控件,這裡設置的尺寸信息實際上就是這個控件的尺寸,跟采集的視頻流數據參數沒有關系。參數7是父窗口的句柄,應該指定某個窗口的句柄,為0是什麼意思呢(問題2)?我猜想應該0是指當前的父窗口(創建捕獲窗的窗口),但是沒有在MSDN中找到相關的依據。參數8是捕獲窗口標識,隨便指定一個標識號即可。
(二)關聯捕獲窗口
capSetUserData(m_capwnd,this);
此函數的功能是將剛剛創建視頻捕獲窗口同創建它的視頻捕獲類通過類指針關聯起來,如果編寫Windows API程序,就不需要此關聯。這樣做的好處是以後可以在任何地方(比如在回調函數中)通過capGetUserData函數恢復這個創建了捕獲窗口的視頻類指針,就可以引用這個類的成員變量和成員函數了。
(三)指定回調函數
capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo);
當實時捕獲的視頻流數據填滿視頻緩沖區時,AVICAP會自動調用這裡指定的回調函數OnCaptureVideo。回調函數OnCaptureVideo定義時有兩個接收參數,第一個參數是視頻捕獲窗句柄,第二個參數是一個VIDEOHDR結構,包含了捕獲的視頻幀信息,如總共的字節數,視頻YUV數據的起始地址等,根據這些信息可以實時保存捕獲的視頻流。回調函數的原型為
LRESULT CALLBACK OnCaptureVideo(HWND mwnd,LPVIDEOHDR lphdr)
(四)獲取捕獲驅動程序的版本信息
這一步不是必要的。
capGetDriverDescription(index,devname,100,devversion,100);
第一個參數是捕獲驅動設備的索引號,從0~9,一般連接好攝像頭後,默認該攝像頭設備索引號為0。MSDN裡講可以從注冊表或SYSTEM.INI文件中去查當前安裝的視頻捕獲設備的索引號,可是我都沒有找到,有誰知道嗎(問題3)?還有問題是,當我安裝了兩個攝像頭以後,利用VFW的宏函數只能檢測到一個攝像頭(即索引號為0)的信息,另一個設備便找不到了,是不是VFW只支持一個視頻捕獲設備呢,但從MSDN裡的描述來看,應該可以支持多個視頻設備的,這到底是怎麼回事呢(問題4)?後面幾個參數很簡單,就不贅述了。
(五)連接捕獲設備
capDriverConnect(m_capwnd,index);
此函數將創建的視頻捕獲窗口和視頻捕獲設備連接起來。第一個參數是捕獲窗口句柄,第二個參數就是捕獲設備索引號。
(六)設置視頻捕獲參數
這一步非常重要。