使用DirectShow捕获AVI视频

时间:2013-01-21 08:00:02

标签: c++ video directshow

我正在尝试使用DirectShow AVIMuxFileWriter过滤器捕获AVI视频。 当我连接SampleGrabber过滤器而不是AVIMux时,我可以清楚地看到该流是30 fps,但是在捕获视频时,每个帧重复4次,我获得120帧而不是30帧电影比它应该慢4倍,只有4组中的第一帧是关键帧。 我尝试了8 fps的相同实验,对于我收到的每张图片,我在视频中有15帧。在15 fps的情况下,我得到每帧8次。

我尝试用C ++编写代码并使用Graph Edit Plus进行测试。 有什么方法可以控制它吗?可能对AVIMux过滤器有一些限制吗?

1 个答案:

答案 0 :(得分:0)

您没有指定可能对问题产生影响的捕获格式,但通常听起来像写入文件时的图形有一些瓶颈阻止流继续以30fps流动。相机正试图以30fps的速度生成帧,只要缓冲区被回收再填充它就会这样做。

但是这里的缓冲区不可用,因为文件编写器忙于将它们放到磁盘上。捕获过滤器是饥饿的,在这种情况下,它会增加“丢帧”计数器,该计数器随每个捕获的帧一起移动。 AVIMux使用此计数将指示符插入到AVI文件中,该文件实际上表示“此处应该有一个帧可用于写入文件,但不是;在播放时重复最后一帧”。所以文件应该有每秒30帧的占位符 - 一些填充实际帧,一些“丢帧”。

另外,你没有提到你是否正在复用音频,这将作为图形的参考时钟来保持音频 - 视频同步。当捕获完成时(如果也使用音频流),AVIMux会改变视频流的帧速率,以使两个流的持续时间相等。您可以通过转储AVI文件头来检查AVIMux是否已更改视频流的帧速率(或者可以右键单击资源管理器中的文件并查看属性)。

如果我不得不冒险猜测问题的根源,我会打赌捕获驱动程序在计算丢弃的帧数时会出现错误,这反过来又搞乱了AVIMux。用不同的相机会发生这种情况吗?