DirectShow编码丢帧补偿

时间:2015-07-27 07:37:52

标签: winapi encoding directshow video-capture directshow.net

我目前在GraphEdit中有一个DirectShow图形,如下所示:

      Source(USB WebCam) -> Encoder -> Mux -> File Writer

但是,如果Source丢失正在记录的帧,则编码器将无法补偿该丢失。这意味着如果我已经录制了30秒的视频,并且丢弃了20%的帧(作为示例),则生成的视频将会以24秒的视频结束。

这意味着视频中的所有内容都会加速1.2倍,这绝对是不可接受的,我用VLC播放器和WMP重播视频 - 结果相同。就好像编码器(?)或图中的其他滤波器并不关心丢帧。

我用来重现此问题的编码器是WMV9和第三方H264过滤器。

即使在录制过程中CPU使用率非常高,我仍然需要能够处理和补偿丢帧,以便视频的时间轴不会突然停止。那里有一个过滤器来处理这个问题,还是我需要在图表中自己做一些事情?这里到底发生了什么?

非常感谢。

修改 我尝试使用Asf Writer过滤器构建更简单的图形,并使用音频源,如附图所示。                                                                              然而,因为我的捕获源(相机)丢失帧,结束视频最终会出现大的同步问题,这意味着音频长度比视频长,并且不同步(而不是补偿)我本来希望看到视频捕捉直到音频。

DirectShow Simple Graph

1 个答案:

答案 0 :(得分:3)

如果您最终得到一个较小持续时间的文件(按丢帧长度),问题可能是管道中某个过滤器中的错误。

可能导致此行为的潜在问题分为两类:

  1. 多路复用器忽略丢弃的帧并合同生成文件
  2. 多路复用器上游的一个过滤器是从帧中删除时间戳,这使得无法看到"丢弃的帧和滤波器后退(一些多路复用器将中止,而不是错误),以假定连续的视频序列
    • 如果您使用网络摄像头的预览输出而不是捕获输出
    • ,也可能会出现此问题