好的,所以我得到了MediaFoundation的要点:
当我启动我的App时,我创建了一个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没有标志)会导致内存泄漏,因为会话从队列中删除拓扑而我的应用程序没有机会在其源上调用shutdown。
此外,如果我在设置下一个mediaSource的拓扑之前(即在我收到MESessionTopologyStatus事件之前)调用当前mediaSource上的Shutdown,那么我就无法播放下一个mediaSource。为什么?我不知道,msdn没有解释当我在mediaSource上调用shudown时释放了什么资源,所以我想我还需要一些东西才能播放下一个mediaSource ...
答案 0 :(得分:0)
我的经验是,如果你不调用Source on Shutdown,你就会有内存泄漏。检查我的项目MFNode。有一个自定义MediaSession(MFNodePlayer项目)。 如果取消注释源上的Shutdown调用,您将看到内存泄漏。
许多消息来源都希望你调用Shutdown,因为你需要等待来自源的停止消息(它们通常是异步的)。 如果您尝试在停止之前使用源,您将面临一些奇怪的错误/行为和内存泄漏。
您必须等待源停止,才能拥有稳定的应用程序。在源代码上调用Shutdown就是为了这个。