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

时间:2016-04-13 15:35:31

标签: ffmpeg frame-rate video-recording libavcodec libavformat

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

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

2 个答案:

答案 0 :(得分:0)

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

  • 在写入时检查每个帧的时间戳
  • 如果您的帧数少于N秒,则需要制作重复的帧。
  • 如果你的帧数比N多一秒,你需要删除一些帧。

在写作之前,您需要指定精确的帧速率。

您的视频文件编写引擎必须使用指定的帧速率。

您可以使用ffmpeg实现此目的。

答案 1 :(得分:0)

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

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