DirectShow编辑服务中视频转换的内存问题

时间:2011-01-18 05:17:04

标签: directshow

当使用DES在重叠的视频剪辑或静态图像之间进行转换时,我遇到了一个奇怪的,显然与内存相关的问题,我很想知道其他DES用户是否发现了同样的问题,或者是否有一些错误我自己一直无法找到。

我发现一旦时间轴有足够数量的过渡,时间线将停止渲染回放的一部分。没有DirectShow错误发生且DirectShow没有报告播放已完成,但IVMRWindowlessControl9 :: RepaintVideo将返回S_OK而不绘制任何内容,并且我在插入过滤器链中的变换过滤器将停止获取其调用的Transform()方法。

如果我继续添加转换(这也意味着添加新剪辑以进行转换),播放将在时间轴中更早和更早失败,直到最终DirectShow根本不会呈现任何内容。

Windows任务管理器指示播放期间内存使用量稳步增加,每次播放到达转换时跳转,在渲染失败时内存使用量增加约150 mb。在此之后,对new或fopen的调用有时会失败,尽管这不是一种可靠的行为。播放相同的剪辑但它们之间没有过渡将导致内存使用量比前三个或四个剪辑增加约50mb,但没有进一步增加,渲染永远不会失败。

发生故障的速度的关键似乎是输入媒体的尺寸。对于1920 x 1080静止图像,时间线中大约35次转换将开始失败;使用640 x 480视频剪辑,大约需要80个。其他因素 - 静止图像与视频剪辑,过渡长度,使用的特定过渡 - 似乎没有什么区别。

当我重新开始播放时,150 MB的额外内存将被释放(虽然不是在我停止时),我可以在单个会话期间添加或删除转换以使问题出现和消失,这似乎表明反对纯粹的内存泄漏,虽然我还没准备好排除任何事情。

如果这增加了任何问题,我的开发机器正在运行64位Windows 7。

总结一下:我正在试图弄清楚这是否是一个我将不得不解决的DES错误,或者是否经常证明是这样,这是我自己的错误。让其他开发人员能够创建具有大量转换(50 - 100)成功播放的DES时间线吗?或者遇到同样的问题并想出如何处理它?或者是否有任何微软员工潜伏在那里谁可以确认这是一个DES错误并建议解决方法?

感谢您花时间阅读这篇冗长的消息,并提前感谢您的回复。

1 个答案:

答案 0 :(得分:0)

我认为答案有点迟了,但您是否启用了与IRenderEngine::SetDynamicReconnectLevel()的动态重新连接?