2012-03-19 74 views
2

我正在編寫一個註冊爲CLSID_VideoInputDeviceCategory的DirectShow源過濾器,因此它可以被視爲一個視頻捕獲設備(例如,它被視爲一個視頻捕獲設備另一個WebCam)。 我的源代碼過濾器基於來自here的VCam示例,現在,濾鏡會生成如此示例的精確輸出(帶有一個視頻輸出引腳的隨機彩色像素,無音頻),所有這些都在FillBuffer()方法中實現的唯一輸出引腳。DirectShow - 如何從源過濾器讀取文件

現在真實場景會有點棘手 - 過濾器使用文件句柄到硬件設備,使用CreateFile()API調用打開(打開設備不在我的控制之下,並且由3Party圖書館)。它應該從這個句柄中讀取數據塊(通常是256-512字節的塊大小)。 該設備是一個WinUSB設備,3Party框架只是「給我」一個打開的文件句柄來讀取塊。 過濾器讀取的數據是* .mp4文件,從設備流式傳輸到「句柄」。

此方案等同於從磁盤上的* .mp4文件(以「塊」形式)讀取並將其數據推送到DirectShow圖形的源過濾器,但無法從開始到結束完全讀取文件,所以文件大小是未知的(正確?)。

我對DirectShow非常陌生,感覺好像缺少一些基本概念。我會很高興,如果任何人都可以指導我解決以下問題的\ resources \解釋:

1)從網絡和Microsoft SDK(v7.1)示例的各種來源,我瞭解,對於應用程序如Skype)來構建正確的&有效的DirectShow圖形(因此它將成功呈現視頻&音頻),源過濾器引腳(從CSourceStream繼承)應實現方法「GetMediaType」。根據此實現函數的返回值,應用程序將能夠構建正確的圖來呈現數據,從而構建正確的過濾器順序。如果這是正確的 - 我將如何在我的情況下實現它,以便圖形將被構建爲呈現* .mp4輸入塊(我們可以假設塊大小不變)?

2)我注意到FillBuffer()方法應該爲它獲取(和填充)的IMediaSample對象調用SetTime()方法。我正在讀取來自設備的原始* .mp4數據。我是否必須解析數據並從流中提取幀的時間值?&?如果是的話 - 一個例子會很棒。

3)我需要將從文件句柄(「塊」)接收的數據拆分爲視頻&音頻,還是可以將數據推送到圖形,而無需在源過濾器中對其進行操作?如果需要分割 - 如何完成(數據不連續,並且分塊爲塊),這是否會影響所需的「GetMediaType」實現?

如果我使用錯誤的術語,請隨時糾正我。

感謝:-)

回答

3

這是一個很好的問題。一方面這是可行的,但有一些具體涉及。

首先,您的過濾器註冊在CLSID_VideoInputDeviceCategory類別預計將作爲一個實時視頻源。通過這樣做,您可以通過應用程序(例如Skype提供的應用程序)來發現這些應用程序,這些應用程序將嘗試配置視頻分辨率,他們希望視頻以實時速率播放,某些應用程序(如Skype)不期望壓縮這樣的H.264視頻,或者只是拒絕這樣的設備。你既不能附加音頻從右到這個過濾器的應用程序甚至不看的音頻有(不知道你有你的過濾器的音頻,但你提到.MP4文件,音頻可能會出現)。

您提出的問題:

1 - 你必須的應用需求,更好的畫面通過檢查方法的應用程序調用上的過濾器是什麼接口。大多數方法都由BaseClasses實現,並將調用轉換爲內部方法,如GetMediaType。是的,您需要實施它,通過這樣做,您可以 - 通過嘗試您支持的特定媒體類型,使您的過濾器與下游過濾器引腳連接。

同樣,那些不能我MP4塊,即使這樣的做法可以在其他的DirectShow圖形工作。實現視頻捕獲設備,你應該提供準確的視頻幀,最好是解壓縮(以及那些可能被過於壓縮,但你會立即有兼容性issies與應用)。

您可能會想到的一種解決方案是在內部嵌入一個全功能圖形,然後管道將這些圖塊解析並解碼並傳遞給您的自定義渲染器,並將幀重新展示給它們關閉您的虛擬設備。這可能是一個很好的設計,儘管假設對過濾器內部工作方式有一定的瞭解。

2 - 如/有望成爲活源,這意味着你在實時傳送視頻和框架不一定是時間標記您的設備通常處理。所以,你可以把時間那裏,是的,你肯定需要從原始媒體中提取時間戳(或將其交由內部圖表進行如上述第1項提到的),但請做好準備,應用帶時間戳特別是對於預覽的目的,因爲來源是「現場」。

3 - 再回到音頻,您可以不執行相同的虛擬設備上的音頻。那麼你可以,而且這個過濾器甚至可以在定製的圖形中工作,但是這不適用於應用程序。他們將尋找獨立的音頻設備,如果你實現了這樣的設備,他們會分開實例化它。因此,您需要實現虛擬視頻和虛擬音頻源,並在幕後實施內部同步。這是時間戳很重要的地方,通過正確提供它們,您可以在實時會話中保持脣形同步,使其與原始流式傳輸媒體文件上的脣形同步。