2016-03-07 34 views
0

我已經設置了一個WMF會話(構建了一個指向網絡攝像頭的源和一個用於屏幕輸出的標準EVR的IMFTopology對象),並將其指定給IMFMediaSession並開始預覽。一切都很好。如何爲已更改的攝像頭分辨率(WMF)重置拓撲結構

現在,我停止了會議(等待實際停止),更改源的分辨率(通過其IMFMediaTypeHandler設置適當IMFMediaType),然後建立與新源新拓撲和新創建IMFActivate對象EVR。還要更改輸出窗口的大小以匹配新的幀大小。

當我開始新的會話時,沒有圖像(或圖像是亂碼,或在底部切斷 - 取決於分辨率的變化)。這幾乎就好像新的拓撲結構試圖重新使用先前設置的EVR並且它不能正常工作。

我試着在EVR上設置新媒體類型,試圖強制EVR上的新窗口大小(通過調用SetWindowPos()),試圖通過之前分配的streamID獲得該輸出節點並設置它的首選輸入格式...沒有任何工作 - 當我開始播放時,我得到相同的黑色(或亂碼)圖像。

「新」會話正確播放的唯一時間是當我選擇回原始源格式。然後繼續,好像沒有什麼不幸發生。

這是爲什麼?我該如何解決?

不提供源代碼,因爲沒有簡單的方法只提供相關部件。通常,我的代碼嚴格遵循MSDN關於創建媒體會話以播放文件的文章。

根據MS的文檔,IMFMediaSession正在管理源的啓動/停止,所以當我改變源的視頻格式(否則應用程序失敗)時,我依賴該源。

回答

0

如果要構建真正的新拓撲,則需要釋放所有MediaFoundation對象(源,匯,拓撲等)。

如果不是,它可能有點複雜。

+0

從媒體會話中獲取拓撲並釋放它是否足夠?或者我需要保持拓撲指針,並在其上調用一個'Release()',希望它釋放分配給媒體會話的指針? – YePhIcK

+0

或者我用'NULL'拓撲和'MFSESSION_SETTOPOLOGY_CLEAR_CURRENT'標誌復位媒體會話? – YePhIcK

+0

是的,您可以使用MFSESSION_SETTOPOLOGY_CLEAR_CURRENT和NULL。您也可以釋放媒體會話並重新創建它。這不是一項長期任務。 – mofo77