使用 FFmpeg 录制帧率未知的视频

Recording video with unknown framerate with FFmpeg

我正在用 FFmpeg 录制视频,我希望写入的帧速率至少在正确的范围内。现在我采用我的输入声称具有的帧速率,并使用它来设置我的输出视频流的帧速率 (time_base)。然而,这有时与我得到的实际帧速率大不相同(我看到一个流声称 50 fps 但发布时为 9 fps)。

我想做的是使用经过的计时器并计算我记录的帧数,以计算我完成记录时记录的实际帧速率。我似乎在写入任何帧之前在 avcodec_open2 中使用了我的 AVStream 中设置的帧速率。如果我稍后设置它(例如在我写帧时)而 ffplay 可以播放它(抱怨时间增量位是 6 而不是 4)其他视频播放器不能。有没有办法在 写入帧后 设置整个文件的帧速率?如果没有,有没有办法在我录制时告诉帧本身某种时间戳或帧速率,从而生成有效的录制文件?

克里斯。您需要开发新的视频流写入引擎。 因此,如果您将帧速率设置为 [N],则写入引擎将按照速率写入帧。

  • 写入时检查每一帧的时间戳
  • 如果你一秒钟的帧数少于N,你需要制作复制帧。
  • 如果一秒钟内帧数多于 N,则需要丢弃一些帧。

写入前,您需要指定准确的帧率。

并且您的视频文件写入引擎必须以指定的帧率工作。

您可以使用 ffmpeg 实现此功能。

诀窍似乎是以比我更聪明的方式使用 AVCodecContext time_base and AVFrame pts。如果您使用固定帧速率进行录制,则 time_base 设置为 1/帧速率,并且 pts 只是录制帧的递增数字。

相反,现在我在开始记录时启动一个经过的计时器,并在计时器的粒度上将 time_base 设置为 1(在我的情况下,它具有毫秒精度,因此为 1000)。我将帧点设置为编码之前经过的时间量。这种组合产生了一个具有可变帧率的视频文件,可以正确播放。