我正在尝试基于DirectShow SDK中的pushsource示例创建DirectShow源过滤器。这基本上为视频输出一组位图。我已经设置了一个过滤器图表,它使用Async_reader和Wave Parser进行音频,我的新过滤器用于推送视频(过滤器是CSourceStream,我在FillBuffer函数中填充我的帧)。这些都连接到WMASFWriter以输出WMV。
每个位图可以持续几秒钟,所以在FillBuffer函数中,我在传递的IMediaSample上调用SetTime,开始和结束时间相隔几秒。这在渲染到屏幕时工作正常但写入磁盘会导致文件的持续时间太短。在编写WMV时,似乎忽略了最后一个位图(它显示为视频结束而不是持续预期的持续时间)。这是我的过滤器和修改后的推送源过滤器(其中帧长度已经增加)的情况。
我看到了另外一些奇怪的行为,因为在我试图让这个工作的时候,不可能有一个视频长度不是10秒的倍数。我不确定这是什么,但我会提到它,因为它是相关的。
答案 0 :(得分:1)
我认为结束时间完全被忽略了。通常视频样本只有一个开始时间,因为它们是一个时间点。如果视频中有移动,则移动流畅,但视频只是时间点。
我认为解决方案很简单。由于视频在收到下一帧之前保持不变,因此您只需在视频末尾添加虚拟帧即可。您可以简单地重复前一帧。