2016-05-11 78 views
0

我已經開始編寫一些流媒體代碼,它將Windows Media Foundation會話連接到live555流媒體庫。到目前爲止,我已經開始編寫IMFMediaSink和我自己的IMFStreamSink。但是,代碼很快就變得非常複雜。IMFSampleGrabberSinkCallback真的是水槽嗎?

我想知道我是否也可以使用IMFSampleGrabberSinkCallback,因爲它只會收到我希望生活的樣本555。

在重構代碼之前,我想知道MF接收器是否真的是接收器 - 我記得在DirectShow中,樣本獲取器不能在沒有另一個接收器的情況下使用,因爲它是一種轉換。我可以構建一個接收樣本的拓撲結構,將它們通過DMO,編碼器並最終傳遞到接收器而無需任何其他節點?

此外,我想知道這種方法的缺點是什麼(假設它會起作用)?我看到的最明顯的一個是IMFMediaSink支持多個流,因此可以協調音頻和視頻。但是,live555完全是通過時間戳完成的,所以我沒有從中獲益。還有其他的缺點嗎?

回答

1

Sample Grabber的工作方式與DirectShow Sample Grabber的工作方式幾乎相同:可以使用其他簡化的外部接口插入管道對象,以便您可以在流式傳輸時從管道中「導出」有效載荷數據。您提供了一個回調接口,以便在新數據可用時進行調用。兩個採樣器都是如此。

DirectShow SG更靈活,因爲它是一種轉換,您可以將它添加到拓撲中的任何位置。 MF SG只是一個輸出節點。 MF SG提供更多回調方法(IMFClockStateSink方法)。 DirectShow SG是一個非常簡單的過濾器[其中的一個變體]可以作爲SDK示例在源代碼中提供。

DirectShow SG本來不是API核心,但它在開發人員中非常受歡迎。我認爲它的受歡迎程度是爲MF開發類似組件的主要原因:它們保留了命名,概念 - 所有內容。與此同時,微軟退休了DirectShow SG,並將其排除在最新的操作系統版本之外,即使很明顯該API仍在使用中。去繪製邏輯。

+0

感謝您的評論,但讓我重述一下我的問題:我不明白MF SG如何作爲輸出節點,因爲據我瞭解,輸出節點通過提升'MEStreamSinkRequestSample'觸發上游節點中的樣本生成。 。但是,'IMFSampleGrabberSinkCallback'不像'IMFStreamSink'這樣的'IMFMediaEventGenerator'。我有一個基於'IMFMediaSink'和'IMFStreamSink'的(不知何故)工作版本,並且它沒有得到沒有這個事件的任何示例... – Christoph

+1

你不會在那裏插入'IMFSampleGrabberSinkCallback'到管道中。樣本採集器本身實現了它作爲拓撲結構的一部分,因此它自己消耗數據,讓您不用擔心細節。另外,它接受回調接口來通知你數據。他們確實將SG設計爲MF中的媒體接收器,因此它充當輸出節點。另外,如果你只想從MF源讀取,我會看看源代碼閱讀器。源讀取器還允許自動解碼器(如果需要),讓我們以同步和異步方式拉取數據。 –

+0

OK ...所以'MFCreateSampleGrabberSinkActivate'爲我創建了一個節點,它實現了'IMFMediaSink',將數據提取並轉發給'IMFSampleGrabberSinkCallback',我傳遞給'MFCreateSampleGrabberSinkActivate'?我沒有從文檔中得到這個想法...... – Christoph

1

您可以調用MFCreateSampleGrabberSinkActivate函數來創建激活MF對象。此功能需要MediaType - 它必須是代碼中所需的編碼類型。您可以在網站videoinput上找到通過MF網絡攝像頭捕捉視頻的示例代碼。它包含源代碼並允許以RGB24,RGB32,AYUV格式抓取幀。如果你設置H264格式,那麼MF找到適合它的編碼器,並用H264格式的數據找到SampleGrabberSink回調,但你必須設置正確的MediaType。

問候。

+0

感謝分享你的代碼 - 我會看看它,讓你知道它是否回答我的問題。 – Christoph