FFMPEG / libx264:如何指定可变帧速率但具有最大值?

Mar*_*tos 21 video compression ffmpeg framerate

我不想为 FFMPEG/libx264 (-r/-framerate) 提供固定的帧速率,而是想指定一个具有 MAXIMUM 值的可变帧速率,并允许 libx264 在它认为合适的时候降低帧速率。这里的想法是在有扩展静止帧之类的东西时获得额外的压缩(这在我的源视频中发生了很多)。

我意识到预测或双向 MPEG 帧会压缩得非常好,但也有可能源帧速率小于我打算转码的帧速率(可能导致更大的流!)。

小智 27

对您也没有找到答案感到沮丧,我至少要回答其他人关于如何从 FFMPEG启用 VFR(而不是 V B R)输出的问题。

答案是奇怪的命名-vsync选项。您可以将其设置为几个不同的选项,但您想要的是 '2' 或vfr. 从手册页:

-vsync 参数
视频同步方法。出于兼容性原因,旧值可以指定为数字。必须始终将新添加的值指定为字符串。

  • 0、直通

    • 每个帧都带有它的时间戳从多路复用器传递到多路复用器。
  • 1、参照

    • 帧将被复制和丢弃,以准确实现所要求的恒定帧速率。
  • 2、视觉效果

    • 帧与其时间戳一起传递或丢弃,以防止 2 个帧具有相同的时间戳。
  • 降低

    • 作为直通但会破坏所有时间戳,使复用器根据帧速率生成新的时间戳。
  • -1,自动

    • 根据多路复用器功能在 1 和 2 之间进行选择。这是默认方法。

请注意,在此之后,多路复用器可能会进一步修改时间戳。例如,在启用格式选项avoid_negative_ts的情况下。

使用 -map,您可以选择应从哪个流中获取时间戳。您可以保持视频或音频不变,并将剩余的流同步到不变的流。

但是,我没有足够的声誉来发表评论来回答每个人似乎都有的“子问题”。但我确实有一些想法,老实说,我并不是很乐观……但我尝试的第一个想法确实奏效了。所以。

您只需要将-vsync 2选项与-r $maxfps选项结合起来,当然可以用$maxfps您想要的最大帧率替换!它有效!它不会从源文件复制帧,但会丢弃导致文件超过最大帧率的帧!

默认情况下,它-r $maxfps本身似乎只是导致它复制/丢帧以实现恒定的帧速率,并且-vsync 2它本身会导致它直接拉入帧而不会真正影响 PTS 值。

我对此并不乐观,因为我已经知道-r $maxfps它会保持恒定的帧率。老实说,我期待一个错误,或者它只是服从先出现的或最后出现的或无论如何。它完全符合我的要求这一事实让我对 FFMPEG 开发人员感到非常满意。

我希望这对您或其他人有所帮助,如果您不再需要知道这一点。

  • `-copyts` 也可能有帮助 (4认同)