词典

什么是帧率?

帧率是视频每秒显示的帧数,单位是 fps。元数据报告可能会以分数形式显示它,例如 25/1。

frame-rate

帧率是视频每秒显示的静止图像数量,这些静止图像叫作帧。单位是每秒帧数,写作 fps。技术标准中也称为帧频。

在视频文件中,帧率是描述视频流的一个元数据值。以 25 fps 为例,每一帧在屏幕上停留 1/25 秒,也就是 40 毫秒。

哪些文件携带它

诸如 MP4、MOV、MKV、WebM、AVI、WMV 和 FLV 等视频格式都可以携带帧率信息。每种格式存储该数值的方式各不相同:

  • MP4 和 MOV:time-to-sample 表会列出具有相同持续时间的一组组帧。ExifTool 会根据这个表计算 VideoFrameRate 的平均值。有些 MP4 文件还会在 VideoAvgFrameRate 和 VideoMaxFrameRate 等标签中保存平均和最大帧率。
  • MKV:DefaultDuration 字段以纳秒为单位给出每帧的时长。FrameRate 字段仅用于参考。
  • WebM:该格式是 Matroska 的子集,也可以使用 DefaultDuration。WebM 指南将 FrameRate 标记为已弃用。
  • AVI:流头中的 rate 除以 scale 的值就是帧率。
  • WMV 和 FLV:元数据中可以包含一个帧率标签。

音频流没有这种意义上的帧率。FFmpeg 的 ffprobe 会为其显示 0/0。

数值的呈现方式

报告中的帧率可以显示为小数,比如 29.97,也可以显示为分数,比如 25/1。分数 25/1 表示 1 秒内有 25 帧。当帧率不是整数时,用分数可以保持精确。

常见的取值包括:

  • 24/1:24 fps,电影胶片常用的帧率
  • 24000/1001:约 23.976 fps,FFmpeg 称之为 ntsc-film
  • 25/1:25 fps,FFmpeg 称之为 pal
  • 30000/1001:约 29.97 fps,FFmpeg 称之为 ntsc
  • 50 和 60:YouTube 所说的视频上传中常见的帧率
  • 120:上限值,而不是常见值。它是 ITU 超高清电视标准中的最高帧率。

恒定帧率和可变帧率

在恒定帧率下,每一帧的时长都相同。在可变帧率下,视频中的帧间时间会发生变化。

FFmpeg 的 ffprobe 会显示两个字段:avg_frame_rate 是平均帧率,r_frame_rate 是基础帧率。基础帧率是可以精确表示所有时间戳的最低帧率,FFmpeg 文档称它为一个估算值。

例如,如果每一帧的时长要么是 1/25 秒,要么是 1/50 秒,那么 r_frame_rate 就是 50/1。平均帧率比这个值低,因此这两个字段会不同。时间戳是按时间基的单位来计数的。

数值的来源

录制视频时会确定帧率。编码器之后可以更改帧率,比如通过删除帧来减小视频大小。

隔行视频可能会显示不同的数值。对于这类视频,Apple 的 AVFoundation 框架报告的是场率,而不是帧率。

它的重要性

帧率主要影响画面运动是否流畅。帧率越高,运动越平滑,但随着帧率升高,提升效果会逐渐变小。低于每秒约 12 帧时,你会感觉是在看一连串静止图像,而不是连续的运动。

从 24 fps 往上,运动通常就比较流畅了,30 或 60 fps 是不错的目标。更高的帧率也会让压缩后的视频文件变大,除非编码器降低帧率。所以在 60 fps 下画面可能比 30 fps 更平滑,但文件体积会更大。

YouTube 要求你按录制时的同一帧率上传视频。在恒定帧率下,帧率乘以时长就得到帧数。例如,25 fps 播放 4 秒就是 100 帧。