我正在使用 Geraint Davies' MP4Demux流式传输一些以前编码的 mp4 文件。
在过去的调查中,我发现 MP4Demux 在加载时为所有原子分配内存。对于较小的文件,这工作正常,但使用较大的 mp4 文件(大约 1.2GB)时,我在 IMediaControl::Run 上遇到内存不足错误。
一个选择是重写/编辑 mp4 解复用器以具有内存池/循环缓冲区,并且仅在需要/请求时读取帧,但我想知道是否有更简单的解决方案,例如比如以某种方式增加 DirectShow 应用程序可以使用的内存(尽管它是一个 32 位控制台应用程序)。
最佳答案
图中典型的内存消费者是内存分配器。撇开根本原因不谈,有时分配过多:缓冲区太多和/或缓冲区太大。分配通常发生在停止到暂停的转换中,这可能是 Run
调用的一部分(它实际上是 Pause
调用的一部分,但如果您调用Run
停止时,也有隐式的 Pause
调用)。
无论是什么原因,首先要检查分配器:暂停图形并查看进程私有(private)字节、进程虚拟地址消耗、分配器属性(GraphStudioNext 和 DirectShowSpy 一起应该能够做到这一点),并检查它是否有意义或者它抓得太多了。
有时它可能会使进程太接近虚拟地址空间限制并且不会立即失败,但内存压力会使其他东西很快失败。
关于c++ - DirectShow MP4Demux 应用程序在 IMediaControl::Run 上内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267632/