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 限制并且失败不会立即发生,但内存压力会使其他事情很快失败。
我正在使用 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 限制并且失败不会立即发生,但内存压力会使其他事情很快失败。