c++ - DirectShow MP4Demux 应用程序在 IMediaControl::Run 上内存不足

标签 c++ windows directshow mp4

我正在使用 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/

相关文章:

java - 如何识别并杀死旧进程来解决JVM Bind Exception?

C# COM 互操作 : How to translate instructions from C++?

c++ - 使用 decltype 返回元素类型的元函数

c++ - 在展开过程中抛出——为什么这个例子有效?

c++ - VS2012 Oracle unique_ptr 崩溃的返回 vector

c - 以编程方式访问笔记本电脑嵌入式风扇 Controller ?

c++ - 查找受其父约束的矩形的算法

windows - 使用 Chef Knife winrm 将文件传输到远程 Windows 机器

audio - 更改 lameDS-3.99.5 DirectShow 过滤器的默认比特率

c# - 使用 C# 获取网络摄像头状态