为什么使用 FFmpeg 将帧速率减半几乎不会减小文件大小?

为什么使用 FFmpeg 将帧速率减半几乎不会减小文件大小?

我有一些大约 2k kbps 的流媒体片段,我想把它们删减一下。

ffmpeg -ss 4:00 -to 4:10 -i in.mp4 -an -vcodec libx265 -crf 26 -preset slow 26s.mp4
ffmpeg -ss 4:00 -to 4:10 -i in.mp4 -an -vcodec libx265 -crf 26 -preset slow -vf fps=30 26sr.mp4

第一个是 60 fps 和 839 KB。第二个是 30 fps 和 807 KB。为什么差别这么小?

答案1

因为在视频编解码器中,记录的是帧之间的差异,而很少记录完整的帧。在现代视频编解码器中,尤其x265,预测技术(主要是运动预测)用于甚至不存储场景元素以与之前相同的速度移动的情况。

因此,通过删除框架,您可以使彼此跟随的框架更加独立,从而包含更多信息,即使只有一半。

尤其是:你明确要求编码器大致实现相同的视觉质量 - CRF - 这意味着如果一个帧与其他帧有更多不同,它将以更高的量化进行编码,从而产生更多比特。这正是你通过 CRF 设置表达的意图!如果你想要一个更小的文件,请降低 CRF 设置,或者通过运行以下代码来选择平均比特率设置

  1. -b:v {desired bitrate, e.g. 200k} -x265-params pass=1 -f null /dev/null第一次通过时,
  2. -b:v {same as above} -x265-params pass=2 26s.mp4第二次传球时。

另一个技巧是,特别是在视频素材中,运动可能是零星的(视频通话参与者的视频!但可能更多的是监控视频、动物园网络摄像头),就是不是指定帧速率 — 对于某些场景中没有太多变化而其他场景中出现快速视觉差异的情况,这根本没什么用 — 但可以使用自适应帧速率。对于 ffmpeg 中的 x265,这就是它的作用-vsync 2;当然,您需要将其删除-vf fps=...才能使其工作。

相关内容