【问题标题】:MediaFoundation: cleaning up after Media SourcesMediaFoundation:在媒体源之后进行清理
【发布时间】:2014-02-13 04:25:34
【问题描述】:

好的,我了解了 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(没有标志的即时/清除当前)可能会导致内存泄漏,因为会话会从其队列中删除拓扑,而我的应用程序没有机会对其源调用关闭。

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

【问题讨论】:

    标签: windows-7 ms-media-foundation


    【解决方案1】:

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

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

    您必须等待源停止,才能获得稳定的应用程序。为此,请在源代码上调用 Shutdown。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2016-09-05
      相关资源
      最近更新 更多