如何通过 IMFSourceReader 使用自定义堆

Posted

技术标签:

【中文标题】如何通过 IMFSourceReader 使用自定义堆【英文标题】:How to use a custom heap with IMFSourceReader 【发布时间】:2021-02-10 06:05:07 【问题描述】:

在我们的应用程序中,我们使用 IMFSourceReader 来处理 .mp4 文件的解码以供我们播放。

我们想要做的是在应用程序中保留一定数量的内存,然后配置 IMFSourceReader 在分配 IMFSampleObjects 时将这些保留的内存用作其堆。

我想知道尝试实现这一目标的最佳方法是什么。我相信我们需要按照本文档https://docs.microsoft.com/en-us/windows/win32/medfound/writing-a-custom-media-source#generating-source-data 中的建议实现自定义媒体源,并使用 MFCreateSourceReaderFromMediaSource 方法。对吗?

此外,我仍然不清楚我们将在哪里进行内存分配。我们是否还需要创建一个新的 IMFMediaBuffer 对象?

【问题讨论】:

【参考方案1】:

我认为在源阅读器媒体管道后面不重新实现 Media Foundation 原语的情况下提供自定义内存堆是不现实的(此外,在问题的上下文中,值得一提的是它的细节)。

但更重要的是,我认为以这种方式做事并没有真正的需要或优势。如果您看到内存压力增加,那么在源阅读器内部为原语定制内存分配器的潜在巨大努力不太可能改善这种情况。这是该功能最初不存在的原因之一。

【讨论】:

媒体基础原语是什么意思,这不仅仅是媒体源和媒体缓冲区吗?我们的应用程序对其所有分配都使用自定义堆,我们最近在内存有限的设备上进行了测试,并遇到了来自源读取器的 E_OUTOFMEMORY,似乎是随着其内部媒体源缓存的增长。然而,我们可以将它指向我们的自定义堆,应该有足够的内存让它在那里运行 即使确实可能发生其中一个管道元素浪费或泄漏内存,答案^^^仍然有效。首先,自定义分配器看起来并不完全是解决方案。其次,对于这类问题(这是一个令人讨厌的问题),您必须收集更多信息。第三,仍然没有提供分配器覆盖。最后,即使您想替换其中一个管道元素,这在本问题的上下文中是可能的但不太可能,您需要缩小范围并将问题归因于特定元素。 @RomanR。我有一个关于 Directshow 和虚拟相机的问题,遗憾的是仍未得到解答。如果您能就这个问题发表意见,我将不胜感激***.com/q/66155154/2404125。

以上是关于如何通过 IMFSourceReader 使用自定义堆的主要内容,如果未能解决你的问题,请参考以下文章

处理来自 IMFSourceReader 和 IMFSample 的图像数据

使用 IMFSourceReader 打开视频文件

使用 IMFSourceReader 进行音频流式传输(Microsoft Media Foundation)

在使用 IMFSourceReader 时转换流媒体类型

IMFSourceReader.ReadSample 在读取流 1 后从不触发回调。对流 0 的调用工作正常

有效地将异步 IMFSourceReader 连接到同步 IMFTransform