分辨率
常见的分辨率有:
- 720p: 1280×720 (HD)
- 1080p: 1920×1080 (Full HD)
- 2K: 2560×1440
- 4K: 4096×2160
1080p 中的 p 指的是视频逐行扫描 (Progressive Scanning),1080i 的 i 指的是隔行扫描 (Interlace Scanning)。
隔行扫描是显像管 (CRT) 时代的产物,由于信号带宽不足而妥协的产物,如今已无需考虑。
帧率
常见的帧率有:
- NTSC: 29.97 帧(美国的历史遗留问题导致)
- PAL: 25 帧(中国和欧洲制式标准)
封装格式 / 编码格式
封装格式相当于一种容器,将音视频打包进行播放。因此,视频文件是一个包括了视频、音频和媒体信息的容器。
把视频和音频封装在一个格式的过程就是视频压制。而编码格式 (CODEC) 是指将视频和音频压制需要遵循的规格就是编码规则。
视频和音频都需要经过编码,才能保存成文件。不同的编码格式,有不同的压缩率,会导致文件大小和清晰度的差异。
一般来说,视频文件的后缀名反映了它的封装格式。不同的封装格式对应以下编码格式:
# 视频
MP4: H.264, H.265, MPEG4, ...
AVI: MPEG-2, AC-1, H.264, DIVX, XVID, ...
MOV: MPEG-2, XVID, H.264, ...
WMV: WMV, AC1, ...
WebM: VP8, VP9, ...
RM/RMVB: RV, RM, ...
TS/PS: MPEG2, H.564, MPEG4, ...
MKV: 可封装所有编码格式
# 音频
MP3
AAC
对于具有相同编码格式的封装格式之间的转换十分便捷,只需直接复制即可。而对于具有不同编码格式的封装格式之间的转换,则需要较长时间。
上述所有均为有损的编码格式,编码后会损失一些细节,以换取压缩后较小的文件体积。否则视频体积过大。
编码器
编码器 (encoders) 是实现某种编码格式的库文件。只有安装了某种格式的编码器,才能实现该格式视频/音频的编码和解码。
以下是一些 FFmpeg 内置编码器。
# 视频
libx264: 最流行的开源 H.264 编码器
NVENC: 基于 NVIDIA GPU 的 H.264 编码器
libx265: 开源的 HEVC 编码器
libvpx: 谷歌的 VP8 和 VP9 编码器
libaom: AV1 编码器
# 音频
libfdk-aac
aac
码率
码率 (bitrate) 又叫比特率或数据速率,是指每秒钟视频数据量有多少比特 (bit)。
码率的单位是 bps (Bit Per Second),也即每秒的比特数。
视频和音频有各自的码率,总比特数其实指的是每秒钟视频码率和音频码率之和。
码率整体上决定了一个视频的大小。
但码率也并非越高越好,高到一定程度,人眼就无法区分其画质好坏了,但视频会变得很大,即边际递减效应。
码率计算视频大小
由于 1byte (字节) 为 8bit (位),而 1KB 为 1024byte,也即 8192bit。
假如一个视频时长为 3min,码率为恒定的 6000kbps,则这个视频的大小计算为:
码率类型
常有的视频码率类型有:
- CBR: 固定码率,视频全程码率固定。
- VBR: 动态码率,根据场景动态调整码率。
- VBR-2 Pass: 即 VBR 渲染两遍。第一遍分析视频复杂度,分配好每帧码率。第二遍再渲染视频,从而更加精确控制。
- CRF: 固定画质质量,但码率大小不可控。
视频压缩
1920×1080 的视频,每一帧有约 200 万个像素。
而每个像素由 RGB 构成,每个颜色占 1 个 byte。
因此,一帧视频在不压缩时的大小为:
这样,若一秒钟有 60 帧,则大小有 474.61m 大小。因此需要对视频进行压缩。
视频压缩包括帧内压缩和帧间压缩。
- 帧内压缩即将视频中每一帧都压缩为 JPEG 类的有损图像。
- 帧间压缩即只保存几帧关键帧,其余均为预测帧。
不同的编码格式有着不同的压缩方式。在 H.264 中,包括
- I 帧: 完整的关键帧。
- P 帧: 是预测帧,记录宏块的变化信息。
- B 帧: 在 I 帧和 P 帧基础上进一步的双向预测帧。
GOP (Group of Picture): 每一组 IPB 帧的序列包含了多少帧,也即一个 I 帧后要经过多少帧才出现下一帧。
GOP 越大,B 和 P 帧越多,同码率下视频质量越高。