![如何让 ffmpeg 在编码视频时使用相同的比特率?](https://linux22.com/image/1633345/%E5%A6%82%E4%BD%95%E8%AE%A9%20ffmpeg%20%E5%9C%A8%E7%BC%96%E7%A0%81%E8%A7%86%E9%A2%91%E6%97%B6%E4%BD%BF%E7%94%A8%E7%9B%B8%E5%90%8C%E7%9A%84%E6%AF%94%E7%89%B9%E7%8E%87%EF%BC%9F.png)
我有一个使用 mpeg4 编码的 mp4 文件,大小为 20MB,
当我检查它的详细信息时,它说它有一个 308k 可变比特率
然后,当我将其编码为 h264 时,ffmpeg 以恒定的 800k 比特率对其进行转换,
结果文件大小变成了 60MB
如何从原始视频中获取比特率信息,然后在编码时匹配比特率?
当我将结果与 Handbrake 进行比较时,我注意到 Handbrake 自动降低了比特率,从而产生了较小的文件大小。Handbrake 如何估算比特率?
答案1
您可以使用 ffprobe 获取视频的详细信息。安装 ffmpeg 时会附带 ffprobe,它用于获取视频的详细信息。
例如:
ffprobe video.mp4
将返回类似这样的内容:
...
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
Metadata:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf58.51.100
Duration: 00:00:16.30, start: 0.000000, bitrate: 932 kb/s
Stream #0:0(und): Video: mpeg4 (High) (avc1 / 0x31637661), yuv420p, 640x640 [SAR 1:1 DAR 1:1], 795 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
Metadata:
handler_name : VideoHandler
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
handler_name : Vireo Ears v2.6.2
现在您可以找到原始视频的比特率(在本例中,视频为 932kb/s,音频为 128kb/s)
如果我想复制这些比特率并转换为 h264,我会这样做:
ffmpeg -i video.mp4 -vcodec h264 -b:v 932k -b:a 128k output.mp4
这可能不一定能保留原始视频的质量,并且大小也可能不一定相同,但您将获得完全相同的平均比特率。
如果您想要保持精确的质量,请使用-crf 0
无损输出,但文件大小可能会大很多。如果您想要视觉上无损的质量,请将值更改-crf
为 18-23 之间。这将使文件大小比使用时更小-crf 0
,并且视觉上看起来几乎相同。
Ffmpeg 提供比 handbrake 更好的定制化,虽然我不知道 Handbrake 所用到的所有功能,但我认为他们很可能会使用一些类似的功能来ffprobe
获取视频数据。