我已經開始編寫一些流媒體代碼,它將Windows Media Foundation會話連接到live555流媒體庫。到目前爲止,我已經開始編寫IMFMediaSink
和我自己的IMFStreamSink
。但是,代碼很快就變得非常複雜。IMFSampleGrabberSinkCallback真的是水槽嗎?
我想知道我是否也可以使用IMFSampleGrabberSinkCallback
,因爲它只會收到我希望生活的樣本555。
在重構代碼之前,我想知道MF接收器是否真的是接收器 - 我記得在DirectShow中,樣本獲取器不能在沒有另一個接收器的情況下使用,因爲它是一種轉換。我可以構建一個接收樣本的拓撲結構,將它們通過DMO,編碼器並最終傳遞到接收器而無需任何其他節點?
此外,我想知道這種方法的缺點是什麼(假設它會起作用)?我看到的最明顯的一個是IMFMediaSink
支持多個流,因此可以協調音頻和視頻。但是,live555完全是通過時間戳完成的,所以我沒有從中獲益。還有其他的缺點嗎?
感謝您的評論,但讓我重述一下我的問題:我不明白MF SG如何作爲輸出節點,因爲據我瞭解,輸出節點通過提升'MEStreamSinkRequestSample'觸發上游節點中的樣本生成。 。但是,'IMFSampleGrabberSinkCallback'不像'IMFStreamSink'這樣的'IMFMediaEventGenerator'。我有一個基於'IMFMediaSink'和'IMFStreamSink'的(不知何故)工作版本,並且它沒有得到沒有這個事件的任何示例... – Christoph
你不會在那裏插入'IMFSampleGrabberSinkCallback'到管道中。樣本採集器本身實現了它作爲拓撲結構的一部分,因此它自己消耗數據,讓您不用擔心細節。另外,它接受回調接口來通知你數據。他們確實將SG設計爲MF中的媒體接收器,因此它充當輸出節點。另外,如果你只想從MF源讀取,我會看看源代碼閱讀器。源讀取器還允許自動解碼器(如果需要),讓我們以同步和異步方式拉取數據。 –
OK ...所以'MFCreateSampleGrabberSinkActivate'爲我創建了一個節點,它實現了'IMFMediaSink',將數據提取並轉發給'IMFSampleGrabberSinkCallback',我傳遞給'MFCreateSampleGrabberSinkActivate'?我沒有從文檔中得到這個想法...... – Christoph