我正在編寫一個註冊爲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」實現?
如果我使用錯誤的術語,請隨時糾正我。
感謝:-)