IMediaControl::Run 上的 DirectShow MP4Demux 应用程序内存不足

DirectShow MP4Demux application out of memory on IMediaControl::Run

我正在使用 Geraint Davies' MP4Demux 流式传输一些以前编码的 mp4 文件。

在过去的调查中,我发现 MP4Demux 在加载时为所有原子分配内存。对于较小的文件,这工作正常,但使用较大的 mp4 文件(大约 1.2GB)时,我在 IMediaControl::Run 上遇到内存不足错误。

一个选择是 rewrite/edit mp4 解复用器有一个 pool/circular 内存缓冲区,并且只读取帧 needed/requested,但我想知道是否有一个更简单的解决方案,例如比如以某种方式增加 DirectShow 应用程序可以使用的内存(尽管它是一个 32 位控制台应用程序)。

图中典型的内存使用者是内存分配器。撇开根本原因不谈,有时分配过多:缓冲区太多 and/or 缓冲区太大。分配通常发生在停止到暂停的转换中,这可能是 Run 调用的一部分(它实际上是 Pause 调用的一部分,但是如果你调用 Run 而停止,还有隐式 Pause 调用)。

无论是什么原因,首先要检查分配器:暂停图形并查看进程私有字节、进程虚拟地址消耗、分配器属性(GraphStudioNext 和 DirectShowSpy 一起应该能够做到这一点),并检查它是否是有道理的,或者它抓住了太多。

有时它可能会使进程太接近虚拟地址 space 限制并且失败不会立即发生,但内存压力会使其他事情很快失败。