天天看點

讓OMCS支援更多的視訊采集裝置

  有些OMCS使用者在他的系統使用了特殊的視訊采集卡作為視訊源(如AV-878采集卡),雖然這些采集卡可以虛拟為一個攝像頭,但有些視訊采集卡需要依賴于自帶了sdk才能正常地完成視訊采集工作。在這種情況下,OMCS是不直接支援這些采集卡的。我們的思路是使OMCS具有自定義擴充的能力:我們讓OMCS提供了擴充接口,讓使用者可以向OMCS架構中注入其自己的視訊采集程式。使用者要達到這種自定義的擴充相當簡單,隻需實作兩個接口即可。

1.IVideoCapturer接口

  OMCS.Engine.Video.IVideoCapturer定義了視訊采集器的基本功能,其用于采集RGB24格式的圖像,其定義如下:

(1)在定義實作該接口的類時,可以通過類的構造函數傳入三個參數:裝置的Index、采集的分辨率、采集的視訊幀率。

(2)OMCS會在合适的時候調用Start方法啟動注入的采集器,采集器啟動後,當每采集到一幀視訊時,就觸發VideoCaptured事件。OMCS内部預定了該事件,以擷取采集到的圖像資料。

(3)如果在采集的過程中,采集器發生了任何異常,請通過觸發VideoError事件來通知OMCS架構。

(4)如果在采集的過程中,更改了采集器采集的分辨率,請通過觸發VideoSizeChanged事件來通知OMCS。

  請特别注意VideoCaptured事件參數的含義:它并不是一個Bitmap的完整資料,而是不包含位圖header的核心資料(OMCS通過設定的采集的分辨率來推斷位圖header的資訊)。從Bitmap轉為不包含頭的核心資料的代碼如下所示:

  當然,如果視訊采集器采集到的本來就是位圖核心資料(通常情況下都是如此),就不需要這層轉換了。

2.IVideoCapturerFactory接口

  在實作完IVideoCapturer接口後,我們還需要實作簡單的OMCS.Passive.IVideoCapturerFactory接口。   

可以按如下邏輯來實作IVideoCapturerFactory的兩個方法:

(1)實作CreateVideoCapturer方法:判斷deviceIndex所對應的視訊裝置是否是特殊的類型,如果是,則new一個我們剛實作的視訊采集類的執行個體傳回;如果不是,則傳回null,表示使用架構内置的視訊采集程式。

(2)實作GetCameraCapability方法:判斷deviceIndex所對應的視訊裝置是否是特殊的類型,如果是,則把該裝置支援的所有分辨率放入清單中傳回;如果不是,則傳回null,以訓示架構自己擷取目标裝置的分辨率資訊。

3.注入到OMCS

  在調用IMultimediaManager的Initialize方法之前,先new一個上面實作的Factory類,然後将其指派給IMultimediaManager的VideoCapturerFactory屬性。這樣,就完成對OMCS視訊裝置的擴充。