ffmpeg 如何确定单个流比特率?

ffmpeg 如何确定单个流比特率?

例如,我有一个视频,ffmpeg 显示

  时长:00:46:43.72,开始:0.540000,比特率:2593 kb/s
    流 #0.0[0x1e0]: 视频: mpeg2video (主), yuv420p, 720x576 [PAR 16:15 DAR 4:3], 9000 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc
    流 #0.1[0x80]: 音频: ac3, 48000 Hz, 立体声, s16, 448 kb/s

文件大小为 908843008 字节,因此 2593 kb/s 是正确的。但为什么会显示视频流比特率为 9000 kb/s?

答案1

MPEG 流通常使用可变比特率编码,以节省易于编码的视频部分的空间,从而提高质量。FFMpeg 报告存储在视频流序列头中的比特率,这是整个文件中的最大比特率(或者,在许多情况下,编码器配置为允许的最大比特率 - 实际文件可能没有任何部分使用如此高的比特率)。9000kbps 的值是来自(或目的地为)DVD 的 MPEG2 流的典型值:DVD 的最大视频和音频比特率为 9800kbps,因此这允许音频使用 ~500kbps 和一些备用的导航数据包和其他开销。

答案2

一般来说,ffmpeg在可以使用的地方使用文件头来获取信息(当它识别出文件头格式时),否则则根据持续时间和文件大小来计算。

包装格式(例如 mov、mp4)没有自己的比特率 - 比特率是各个流的特性 - 但它有持续时间。ffmpeg然后可以根据文件大小和持续时间计算比特率。

但是,流本身会在流标头中指定比特率,因此可以直接从元数据中读取。这意味着标头中可能错误地指定了比特率,或者一开始可能是 9000kb/s,然后降低到更低的比特率,或者流可能被截断,导致文件不完整,因此数学运算无法按预期工作。

如果您提取视频组件(例如:ffmpeg -i myfile.mov -vcodec copy -an testfile.m2v,用法因软件版本而异),您可能能够进一步调查并找出显示的比特率来自哪里。

相关内容