DirectShow 编码丢帧补偿

DirectShow Encoding dropped frames compensation

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

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

但是,如果源在录制过程中丢帧,编码器将不会补偿该损失。这意味着如果我录制了 30 秒的视频,并丢掉了 20% 的帧(作为示例),结果视频将以 24 秒的视频结束。

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

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

尽管 CPU 在录制期间的使用率非常高,但我确实需要能够处理和补偿丢失的帧,这样视频的时间轴才不会突然停止有意义。是否有一个过滤器可以处理这个问题,或者我需要在图表中自己做些什么?这里到底发生了什么?

非常感谢。

编辑: 我尝试使用 Asf Writer 过滤器和音频源构建一个更简单的图表,如您在所附照片中所见。 但是,由于我的捕获源(相机)丢失帧,最终视频会出现严重的同步问题,这意味着音频长度比视频长得多并且不同步(而不是补偿)我本希望看到视频捕捉直到音频。

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

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

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