Windows 7 MediaFoundation:在媒体源之后清理

Windows 7 MediaFoundation:在媒体源之后清理,windows-7,ms-media-foundation,Windows 7,Ms Media Foundation,好的,我了解了MediaFoundation的要点: 当我启动我的应用程序时,我会创建一个IMFMediaSession 当我想播放一个文件时,我会创建一个IMFMediaSource,创建必要的IMFTopology,然后将其设置为IMFMediaSession。根据使用的标志(dwSetTopologyFlags),新媒体源将立即播放,或者在现有拓扑/媒体源播放完毕后,添加到要由媒体会话播放的队列中 现在我的问题是清理旧媒体来源 是否有MediaSession在即将删除所用拓扑之前发送的事件

好的,我了解了MediaFoundation的要点:

当我启动我的应用程序时,我会创建一个IMFMediaSession

当我想播放一个文件时,我会创建一个IMFMediaSource,创建必要的IMFTopology,然后将其设置为IMFMediaSession。根据使用的标志(dwSetTopologyFlags),新媒体源将立即播放,或者在现有拓扑/媒体源播放完毕后,添加到要由媒体会话播放的队列中

现在我的问题是清理旧媒体来源

是否有MediaSession在即将删除所用拓扑之前发送的事件?这样,我就可以从那里访问媒体源并调用ShutDown(从而避免内存泄漏),而不必在代码中保留对以前媒体会话的引用

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

根据MSDN: 在发布之前,我需要对我创建的任何IMFMediaSource调用ShutDown

考虑到这一点,混合使用MFSESSION_SETTOPOLOGY_标志(立即/清除当前无标志)可能会导致内存泄漏,因为会话将拓扑从其队列中删除,而我的应用程序没有机会对其源调用shutdown


此外,如果在设置下一个mediaSource的拓扑之前(即在获取MESessionTopologyStatus事件之前)调用当前mediaSource上的Shutdown,则无法播放下一个mediaSource。为什么?我不知道,msdn没有解释我在调用mediaSource上的shudown时释放了哪些资源,所以我想我仍然需要一些东西才能播放下一个mediaSource…

我的经验是,如果你不在Source上调用Shutdown,你将有内存泄漏。检查我的项目节点。有一个自定义MediaSession(MFNodePlayer项目)。 如果在源上取消对Shutdown调用的注释,您将看到内存泄漏

很多源代码希望调用Shutdown,因为您需要等待来自源代码的stop消息(它们通常是异步的)。 如果您试图在源停止之前使用它,您将面临一些奇怪的错误/行为和内存泄漏

为了有一个稳定的应用程序,您必须等待源停止。在source上调用Shutdown就是为了这个