用 FFmpeg 录制未知帧率的视频
Posted
技术标签:
【中文标题】用 FFmpeg 录制未知帧率的视频【英文标题】:Recording video with unknown framerate with FFmpeg 【发布时间】:2016-08-04 20:00:25 【问题描述】:我正在使用 FFmpeg 录制视频,我希望它所使用的帧速率至少在正确的范围内。现在我采用我的输入声称拥有的帧速率并使用它来设置我的输出视频流的帧速率(time_base)。然而,这有时与我得到的实际帧速率大不相同(我看到一个流声称 50 fps 但以 9 fps 发布)。
我想做的是使用经过的计时器并计算我录制的帧数,以计算我在完成录制时录制的实际帧速率。在我写任何帧之前,我似乎在 avcodec_open2 中使用了我的 AVStream 中设置的帧速率。如果我稍后设置它(例如在我写帧时),而 ffplay 可以播放它(抱怨时间增量位是 6 而不是 4)其他视频播放器不能。有没有办法在写入帧之后设置整个文件的帧速率?如果没有,有没有办法在我录制时告诉帧本身某种时间戳或帧速率,这将导致有效的录制文件?
【问题讨论】:
嗨,我会看更多,但只是想问一下 avconv。在快速谷歌搜索后找到它,看起来它可以改变文件的帧速率。也许您可以以任意帧速率写入文件,然后在检测到实际速率后,完成写入并以新速率运行 avconv?只是一个想法,而不是一个真正的答案;)会继续寻找。让我知道。 avconv 是 libav 项目的二进制名称。 (superuser.com/questions/507386/…) 对所有让我困惑了一段时间的名字进行了相当不错的总结。 avconv 所做的任何事情都应该可以通过它使用的库来实现。 你能解决这个问题吗?我也有同样的问题( @Irina 请参阅下面的答案。基本上,您将时基设置为计时器的粒度,然后每一帧都将 PTS 设置为经过的时间。 【参考方案1】:诀窍似乎是以比我更聪明的方式使用AVCodecContext time_base 和AVFrame pts。如果您以固定帧速率录制,则 time_base 设置为 1/帧速率,而 pts 只是录制帧的递增数字。
现在我开始录制时启动一个经过的计时器,并将 time_base 设置为 1,超过计时器的粒度(在我的情况下,它具有毫秒精度,因此为 1000)。我将帧 pts 设置为编码之前经过的时间量。这种组合会生成一个具有可变帧速率的视频文件,并且可以正确播放。
【讨论】:
【参考方案2】:克里斯。您需要开发新的视频流写入引擎。 所以如果你将帧率设置为[N],那么写入引擎会按照帧率写入帧。
写入时检查每一帧的时间戳 如果一秒钟内的帧数少于 N,则需要制作重复帧。 如果您的帧数在一秒钟内超过 N,则需要丢弃一些帧。在写入之前,您需要指定准确的帧率。
并且您的视频文件写入引擎必须以指定的帧速率工作。
您可以使用 ffmpeg 来实现。
【讨论】:
这似乎是您可以使用可变帧速率做的最好的事情,但如果它是固定的且未知的怎么办?在我提出的流声称 50 fps 但实际上是 9 的情况下,所以当你的方法可行时,我将录制比我需要的多 5 倍的帧。基本上这仍然需要您在开始之前知道帧速率。以上是关于用 FFmpeg 录制未知帧率的视频的主要内容,如果未能解决你的问题,请参考以下文章