我有一部时长 1 分 15 秒的 mp4 影片,由 Sony Alpha 6400 4k 相机拍摄。它的大小为 528MB。我想使用 剪辑它ffmpeg
。虽然我只剪辑了几秒钟,但新视频很多更小。因此,我尝试使用原始未剪切文件进行了一些测试,发现在没有任何选项的情况下,处理本身会生成更小的文件:
ffmpeg -i C0034.MP4 C0034_ffmpeg.MP4
输出文件C0034_ffmpeg.MP4
仅占用 102MB 空间。这大约是输入文件的 1/5,没有应用任何可以减小文件大小的选项,如每秒更少的帧数、更小的分辨率等等。
预设
根据文档:
预设是提供特定编码速度和压缩比的选项的集合。
据我了解,这相当于-mx=X
7zip 的切换:压缩率越高,文件越小。压缩时间越长,但文件质量不受影响。
ffmpeg 的默认设置是中等。我将其更改为veryslow
,得到一个 83.4 MB 的文件,而同一个文件在 中占用 149 MB ultrafast
。从最强压缩到最低压缩,明显有 66 MB 左右的差异。但即使如此,它ultrafast
仍然比原始输入文件小 379 MB,因此默认medium
预设似乎无法解释大部分差异。
这恒定利率因子(慢性肾脏病基金会)
这ffmpeg 的同款 H264 文章显示 CRF。根据文档,它是针对大多数用途推荐的速率控制模式。这似乎是 ffmpeg 用来确定质量和文件大小的一个因素。
CRF 尺度的范围是 0-51,其中 0 表示无损,23 表示默认值,51 表示可能质量最差。
由于它默认使用 23,因此从技术上讲我们无法获得无损输出文件。但它也解释了为什么这些输出文件看起来并不比输入文件差,尽管它们要小得多:
认为 17 或 18 在视觉上是无损的或几乎无损;它应该看起来与输入相同或几乎相同,但从技术上讲它并不是无损的。
通过尝试,似乎 CRF 对文件大小的影响比预设要大得多(这似乎很明显,因为预设只处理压缩,而 CRF 处理质量)。我尝试了一些没有预设的组合(因此使用默认设置):
-crf 23
~> 102 MB(默认)-crf 20
~> 189 MB-crf 18
~> 285 MB-crf 17
~> 347 MB-crf 0
~> 2,64 GB
从第一次测试开始,我就假设找到了原因:CRF 对文件大小有很大的影响,即使 23 和 17 之间没有明显的差异(至少对我来说没有)。
但我真的很好奇-crf 0
(这意味着无损)怎么会比原始输入文件大近 5 倍?从巨大的差异来看,我猜输出文件的质量比输入文件更好。这怎么可能?如何ffmpeg
使输出文件变得那么大?
答案1
并非所有编码器都一样
x264 是一种高效的 H.264 编码器,这意味着它可以在较低的比特率下输出高质量的视频。x264 使用奇特的“心理视觉”技巧来欺骗眼睛,以节省效率较低的编码器可能缺少的比特。
由于其他优先事项(资源更少、最低编码速度要求、电池寿命等),相机和手机上的 H.264 编码器必须做出更多妥协。因此,即使它们制作的是相同的格式,它们的效率也可能非常低,这意味着它们无法以相同的比特率与 x264 匹敌。
x264 的默认设置很好,因此虽然文件大小可能显著减小,但一般用户通常不会看到质量差异。
无损是巨大的
设置-crf 0
使用特殊的压缩无损模式。大多数减小文件大小的技巧在无损模式下无法使用。
处理无损时不应考虑输入文件大小。输入被完全解码为未压缩的原始视频:视频的基本构成块。原始视频是无损的,但由于未压缩,因此文件大小最大。无损编码器随后获取原始视频并对其进行一定程度的压缩,但仍保持无损。类似于 ZIP,但专为视频而设计。比原始视频小,但不如典型的有损 H.264 小,因为它无法使用所有花哨的技巧。否则它将不再是无损的。
不可能创建质量优于输入的输出。它的质量只能小于或等于。无论格式或编码器如何。