2014-02-05 106 views
0

確定後清理,所以我得到MediaFoundation的要點:MediaFoundation:媒體資源

當我開始我的應用程序創建一個IMFMediaSession。

當我想播放一個文件時,我創建了一個IMFMediaSource,創建了必要的IMFTopology,並將其設置爲IMFMediaSession。根據所使用的標誌(dwSetTopologyFlags),新媒體源將立即播放,或者在現有拓撲/媒體源完成播放時添加到由MediaSession播放的隊列中。

現在我的問題是清理後,舊的媒體資源。

在使用的拓撲結構即將被移除之前是否有一個由MediaSession發送的事件?這樣我就可以從那裏訪問媒體源,並在其上調用ShutDown(從而避免內存泄漏),而無需在我的代碼中保留自己以前的mediaSessions的引用。

// =========================================== ====================================更新:

根據MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/aa372153%28v=vs.85%29.aspx 我在釋放它之前需要在我創建的任何IMFMediaSource上調用ShutDown。

考慮到這一點,混合MFSESSION_SETTOPOLOGY_FLAGS(立即/ clear_current沒有標誌)可能導致內存泄漏,因爲會話從隊列中刪除拓撲,而我的應用程序沒有機會在其源上調用關閉。另外,如果在設置下一個mediaSource的拓撲之前(即,在我收到MESessionTopologyStatus事件之前)我調用當前mediaSource上的Shutdown,則我無法播放下一個mediaSource。爲什麼?我不知道,msdn並沒有解釋當我調用mediaSource時發佈什麼資源,所以我想我仍然需要爲了播放下一個媒體資源而正在發佈...

回答

0

我的經驗是如果您不關閉源代碼,則會導致內存泄漏。檢查我的項目MFNode。有一個自定義MediaSession(MFNodePlayer項目)。 如果您在源上取消註銷對Shutdown的調用,則會看到內存泄漏。

許多來源期望您稱爲關機,因爲您需要等待從源停止消息(它們通常是異步的)。 如果您嘗試在停止之前使用源代碼,您將面臨一些奇怪的錯誤/行爲和內存泄漏。

您必須等待源代碼停止,才能獲得穩定的應用程序。在源代碼上調用Shutdown就是爲了這個。

相關問題