DirectShow过滤器图形使用WMASFWriter创建视频太短

DirectShow filter graph using WMASFWriter creates video which is too short

本文关键字:创建 视频 WMASFWriter 过滤器 图形 DirectShow      更新时间:2023-10-16

我试图基于DirectShow SDK的推送源示例创建一个DirectShow源过滤器。这实际上是向视频输出一组位图。我已经设置了一个过滤器图,它使用Async_reader和Wave Parser用于音频和我的新过滤器来推送视频(过滤器是CSourceStream,我在FillBuffer函数中填充我的帧)。它们都连接到WMASFWriter以输出WMV。

每个位图可以持续几秒钟,所以在FillBuffer函数中,我在传入的IMediaSample上调用SetTime,开始和结束时间相隔几秒钟。这在渲染到屏幕上时工作得很好,但写入磁盘会导致持续时间过短的文件。在编写WMV时,最后一个位图似乎被忽略了(它在视频结束时显示,而不是持续预期的持续时间)。这是我的滤波器和修改的推源滤波器的情况(其中帧长度已增加)。

我已经看到了额外的奇怪的行为,这是不可能有一个视频,不是10秒的倍数在一个点上,而我正试图使这个工作。我不确定这是什么,但我想我应该提一下,如果它是相关的。

我认为结束时间完全被忽略了。通常视频样本只有一个开始时间,因为它们是一个时间点。如果视频中有动作,那么动作是流畅的,尽管视频只是时间点。

我认为解决办法很简单。因为视频在接收到下一帧之前保持不变,所以您可以在视频结束时添加一个虚拟帧。您可以简单地重复前一帧。