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


16

我不想为FFMPEG / libx264(-r / -framerate)提供固定的帧速率,而是要指定具有MAXIMUM值的可变帧速率,并允许libx264视需要降低帧速率。这里的想法是在出现类似扩展的静止帧(在我的源视频中发生很多)时获得额外的压缩。

我意识到预测性或双向MPEG帧会很好地压缩,但是源帧率也可能比我要转码的帧率小(可能会导致更大的流!)。


1
您实际上在哪里(或如何)告诉x264本身使用VFR?
slhck

那是我的问题。
Mark Gerolimatos

2
您的问题是如何指定VFR 的最大值。我什至不知道使用x264指定VFR编码的任何方法。(我现在还没有在说ffmpeg,因为它是您的源代码和x264之间的另一层。)
slhck

@MarkGerolimatos找到了答案吗?
Dr.jacky

不,我从没做过。
Mark Gerolimatos

Answers:


18

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

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

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

  • 0,直通

    • 每个帧及其时间戳从多路分配器传递到多路复用器。
  • 1,CFR

    • 帧将被复制并丢弃,以精确达到所需的恒定帧速率。
  • 2,vfr

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

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

    • 根据复用器功能在1到2之间选择。这是默认方法。

请注意,此后,复用器可以进一步修改时间戳。例如,在启用格式选项prevent_negative_ts的情况下。

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

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

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

默认情况下,似乎它-r $maxfps本身仅使它复制/丢弃帧以达到恒定的帧速率,并且-vsync 2它本身使它直接拉入帧而不真正影响PTS值。

我对此并不乐观,因为我已经知道这-r $maxfps可以保持恒定的帧速率。老实说,我希望能有一个错误,或者服从它的先行,后继或任何其他错误。它确实满足我的要求,这一事实使我对FFMPEG开发人员感到非常满意。

我希望这对您或以后的其他人有帮助,如果您不再需要了解这一点。


3
-copyts可能也有帮助
rogerdpack '16

1

我想指定一个具有MAXIMUM值的可变帧速率,并允许libx264视需要降低帧速率。这里的想法是在存在诸如扩展的静止帧之类的东西时获得额外的压缩

以我的理解,这可能以比较笨拙的方式进行,但由于某些复杂和违反直觉的原因,这是不希望的

即使x264流具有帧速率,帧速率也比编解码器更是容器级的问题。

在直通VFR编码中,本质上将是一个文本文件,详细说明在哪些帧/时间上帧速率是多少,并且在对源进行编码时,诸如tcfile-in或tcfile-out之类的功能会将时间戳传递给编码,以绘制速率位置并从源头上使视频主观上保持一致。

低帧率的想法是合乎逻辑的想法,但由于以下几个原因而无法解决。尽管x264具有VFR感知功能,但我认为没有分析功能可以改变运动的帧速率以减小文件大小(与许多比特率控件类似)。

来源也是一个问题:VFR来源默认情况下会保留其帧可变性,但显然以可变比特率编码CFR文件(有时是个好主意,尤其是在需要电视电影的情况下)只会产生相同的CFR。

这意味着您可能必须手动重写比特率(即,将慢速场景的时间戳混入文件中),或者对avisynth求助于诸如dup,dedup和精确Dedup之类帧抽取算法。如果您的视频确实动作过慢,则会丢掉一些帧(甚至一半?)。问题在于这些算法并不先进,并且对于“哪些因素有助于最佳编码”,“现实生活”素材没有做出好的选择。

此外,删除包含I和B帧之类的帧会随着时间的流逝而减少可用细节的数量,这会使运动看起来“步步高升”,并且可能会干扰其他基本视频参数,并导致诸如锯齿的伪影。

由于量化器的工作方式,x264实际上将在这些低运动场景中进一步不成比例地降低比特率。除非您具有相同图像的幻灯片放映,否则会有运动(如果只有颗粒和其他伪影),并且质量上的损失将是比特率发生急剧变化所无法看到的。

最后,没有太多选择可以做您想要的事情的原因是,x264确实非常擅长仅使用时间压缩(记录部分帧中的变化)来管理比特率。设为1/2帧频不会将文件大小减半;10%可能是慢动作或动画带来的实际收益。

简而言之,降低静态场景的比特率对文件大小的影响很小,但是会增加质量和同步问题,更不用说与视频编辑软件不兼容了。

如果您确实想尝试使用抽取器,则可以使用级别选项来限制最大的新帧速率,其中每个选项都具有最大的分辨率和帧速率。不幸的是,您可能必须使用非常低的分辨率才能使用配置文件来获得所需的帧速率。回到完全手动编辑速率,或者校正您认为过高的帧速率。无论哪种方式,如果在保存tcfile的编码过程之后进行了更改,都将需要花很多时间来使声音与新的帧速率保持同步。

值得一提的是,花时间优化许多比特率设置将以文件大小管理的方式获得更多收益,并提高视频质量,而不是带来一点好处的麻烦。除非您的目标是广播或媒体标准,否则保留原始FPS可能是最好的主意。播放器具有很好的播放可变比特率的能力(与编辑器不同),并且视频中的帧越多,由于帧之间的运动变化越小,播放越流畅,文件的大小也可能越小。

这是指向标准信息和论坛讨论的链接的集合,这些链接应有助于解决编码的这一混乱方面:

- AviSynth的抽取工具

- FPS和-r开关
- X264通用(tcfile,FPS)
- 时间码文件的标准
- 级别和配置文件
- 简短,清晰CFR / VFR设置摘要( “帧率”部分)

doom9,videohelp和&c理论讨论
1 2 3 4 5 6 7

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.