5.1 视频编码标准:从 H264 到 AV1


5.1 视频编码标准:从 H264 到 AV1

本节摘要:视频编码的本质是去除空间与时间冗余。本节沿 H.264 → HEVC → AV1 的演进主线,讲清每一代「凭什么更省流量」,并用 ffmpeg 命令演示三种编码的实际用法与兼容性取舍。

本节目标:阅读完本节,你应当能够:

  1. 解释「空间冗余」「时间冗余」两个概念,说出编码器在做什么
  2. 用 ffmpeg 分别编码 H.264、HEVC、AV1,并对比产物大小
  3. 根据「兼容性 vs 体积」给出编码选型建议

一、一段历史:从「一张一张存」到「存差异」

最早的视频编码思路很笨:把每一帧当独立图片压缩。问题在于,一段对话场景里连续 100 帧几乎一模一样,每帧都完整存一遍纯属浪费。工程师们很快发现两个「作弊」机会:

  • 空间冗余:一帧画面内部,大片天空、墙面颜色相近,可以只存变化
  • 时间冗余:相邻帧之间变化很小,可以只存「这一帧和上一帧的差异」

H.264(2003 年)把这套「分块 + 帧间参考」做到极致,成为统治十几年的主流。HEVC(2013 年)把分块从 16×16 扩大支持到 64×64,同样的画质能再省约一半流量。AV1(2018 年,开源阵营)在 HEVC 基础上继续打磨,是新一代流媒体的宠儿。

二、核心原理:每一代省在哪

编码 出生年代 核心手段 相对 H.264 的省流量 兼容性
H.264 2003 16×16 宏块 + 帧间预测 基准 最广,所有设备支持
HEVC 2013 更大块 + 更多帧内预测模式 约省一半 广泛但旧设备有坑
AV1 2018 开源 + 更细的帧内帧间预测 再省 20–30% 靠软件解码,硬解有限

关键认知:「省流量」不等于「压缩率数字好看」,而是「同样观感下比特更少」。H.264 用了 8 Mbps 的码率,HEVC 可能 4 Mbps 就达到接近观感,AV1 再压到 3 Mbps。但这三者在「编码耗时」上天差地别:AV1 软编最慢,H.264 软编最快。选型从来不是「最省的最好」,而是体积、速度、兼容性的三角。

三、工程实践要点

编码命令三连

# H.264(最通用) ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac output_h264.mp4 # HEVC(省流量,兼容性略降) ffmpeg -i input.mp4 -c:v libx265 -crf 26 -preset medium -c:a aac output_hevc.mp4 # AV1(最省,但慢且硬解有限) ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 0 -c:a opus output_av1.mkv

三条命令对比:同样一段 1080p 视频,产物体积通常 HEVC 比 H.264 小近一半,AV1 再小一点,但编码耗时 AV1 可能比 H.264 慢 5–10 倍。crf 值在不同编码器语义不同(H.264 的 23 ≈ HEVC 的 26 ≈ AV1 的 30),这是各编码器的「画质档位」对应关系,直接照搬即可。

用 ffprobe 验证编码结果

ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,bit_rate -of csv=p=0 output_h264.mp4

如果命令行里没指定编码器,ffmpeg 会按容器「猜」一个默认编码器(比如 MP4 默认 H.264),但猜的不一定是你想要的。显式写 -c:v 永远是更稳的做法。

编码器存在吗?先查支持

# 查看当前 FFmpeg 支持哪些编码器 ffmpeg -encoders | grep -E "libx264|libx265|libaom"

如果 libx265 没出现在列表里,说明你的 FFmpeg 编译时没带它,命令会报 Unknown encoder

用一张图记住三代编码的定位:

05-01-fig01

图说明:三代定位

三代编码是「兼容性递减、省流量递增」的阶梯。选型先问两个问题:目标设备支持什么?能接受多长的编码耗时?答案组合决定选哪代。

常见坑:HEVC 有专利费争议,商用转码服务用 HEVC 前先确认授权策略(第 10 章会展开);AV1 虽然开源免专利,但很多终端(尤其老手机)只能软解,4K 下软解容易发热卡顿。

💡 关键直觉:选编码就是选「兼容性、体积、速度」三者的交集。没有「最好」的编码,只有「这个场景最合适」的编码——先定场景,再选编码,别被「越新越省」冲昏头。

帧类型:I、P、B 为什么影响体积和剪辑

编码效率的差异,根源在帧类型。I 帧是完整画面,体积最大;P 帧只记录与前一帧的差异;B 帧会同时参考前后两帧,体积最小但解码顺序与显示顺序不同。一个 GOP(图像组)通常以一个 I 帧开头,后面跟着一串 P 和 B 帧。

# 查看帧类型分布,直观感受三种帧的体积差异 ffprobe -v error -show_frames -select_streams v:0 -show_entries frame=pict_type -of csv=p=0 input.mp4 | sort | uniq -c

这个命令统计出的 I/P/B 比例,直接对应压缩率。剪辑视频时,切割点对齐到 I 帧最省事;直播推流时,-g 参数控制关键帧间隔,间隔越大压缩率越高,但丢包恢复越慢。理解帧类型,你就理解了很多「为什么转出来体积这么大」「为什么直播花屏后半天缓不过来」的问题。

本节要点回顾

  • 两种冗余:空间冗余(画面内部重复)与时间冗余(帧间相似),编码器靠去除它们省流量
  • 三代阶梯:H.264 最兼容、HEVC 省一半、AV1 再省两到三成,同时速度递减
  • crf 语义因编码而异:同样画质档位 H.264 约 23、HEVC 约 26、AV1 约 30
  • 显式指定编码器:-c:v libx264/libx265/libaom-av1,别依赖容器默认
  • 选型看场景:兼容优先选 H.264,省流量选 HEVC,不在乎速度且要开源选 AV1

下一节看声音那半边——音频编码标准和场景怎么配。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U