3. 视频流基础概念:视频编码原理与码率控制

做流媒体的人,天天跟编码打交道。但说实话,很多人用了好几年 FFmpeg,对 H.264 到底怎么压缩的、GOP 结构怎么影响延迟、CBR 和 CRF 到底选哪个,心里还是没底。

我当年刚入行时也踩过不少坑。有一次线上直播卡得不行,查了半天才发现是 GOP 设得太长,推流端断连后客户端等了快 10 秒才恢复画面。嗯,从那以后我再也不敢随便设 GOP 了。

这一节,咱们把视频编码的底裤扒开看看。

3.1 视频编码原理:H.264 / H.265 到底在干什么

视频编码的核心就一句话:去掉冗余。空间冗余、时间冗余、视觉冗余,能去的都去掉。

H.264(AVC)和 H.265(HEVC)是目前最主流的两种编码标准。H.265 的压缩率比 H.264 高 30%~50%,但计算复杂度也翻了好几倍。

关键区别:

  • H.264:兼容性好,硬件支持广泛,适合直播、点播、视频通话
  • H.265:压缩率更高,适合 4K/8K、高码率场景,但编码器更吃 CPU

我个人的习惯是:1080p 以下用 H.264,4K 以上优先 H.265。当然,如果你客户端解码能力有限,H.264 永远是安全牌。

3.2 GOP 结构:关键帧的节奏

GOP(Group of Pictures)就是一组连续的画面。它决定了你多久能随机访问一个视频流。

GOP 里最重要的参数是 IDR 帧间隔(也叫关键帧间隔)。IDR 帧是一个「重置点」,解码器看到 IDR 帧后,之前的参考帧全部作废,重新开始解码。

实战建议:

直播场景下,GOP 建议设为 2~4 秒(比如 30fps 时设 60~120 帧)。太长会导致频道切换或断线重连时黑屏太久。点播场景可以设 5~10 秒,压缩率更好。

我曾经遇到一个客户,把直播 GOP 设成了 300 帧(10 秒),结果用户切频道后平均要等 8 秒才能看到画面。改成 60 帧后,切频道延迟降到 1 秒以内。

3.3 I/P/B 帧:谁是谁的参考

视频帧分三种:

帧类型 全称 压缩方式 大小 作用
I 帧 Intra Frame 帧内压缩(类似 JPEG) 最大 独立解码,不依赖其他帧
P 帧 Predictive Frame 参考前面的 I 或 P 帧 中等 只存差异部分
B 帧 Bi-predictive Frame 参考前后帧 最小 压缩率最高,但需要缓存

你想想看,B 帧为什么压缩率最高?因为它可以「瞻前顾后」,同时参考前面和后面的帧。但代价是解码器需要缓存未来帧,延迟会增加。

注意:直播场景下,我建议禁用 B 帧或限制 B 帧数量。B 帧会引入额外的编码延迟,对实时性要求高的场景不友好。我曾经在视频通话项目里因为开了 B 帧,导致端到端延迟多了 30ms,用户明显感觉到卡顿。

3.4 码率控制模式:CBR、VBR、CRF

码率控制就是决定「每一帧给多少比特」。选错了,要么画质崩,要么带宽浪费。

3.4.1 CBR(恒定码率)

每一秒的输出码率基本恒定。适合直播、视频会议等带宽固定的场景。

  • 优点:带宽可控,不会突然飙高
  • 缺点:运动场景画质下降明显(因为码率不够分)

3.4.2 VBR(可变码率)

码率根据画面复杂度动态变化。适合点播、存储场景。

  • 优点:画质更稳定,复杂场景给更多码率
  • 缺点:峰值码率可能很高,带宽不好预估

3.4.3 CRF(恒定质量)

这是我最常用的模式。你设定一个质量值(0~51,默认 23),编码器自动分配码率来保持这个质量。

  • 优点:简单,一行命令搞定,画质稳定
  • 缺点:输出码率不可控,不适合直播

我的选择原则:

  • 直播:CBR,配合 2-pass 或 1-pass 快速编码
  • 点播:CRF 23~28,省心又省力
  • 存档/母版:CRF 18~22,保留最高画质

举个例子,FFmpeg 里怎么用:

# CBR 直播推流
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -minrate 2000k -maxrate 2000k -bufsize 4000k output.ts

# CRF 点播转码
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4

# VBR 点播(2-pass)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 1 -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 2000k -pass 2 output.mp4

3.5 知识体系总览

下面这张图把本章的核心逻辑串起来了。我建议你保存下来,以后调优时对照着看。

视频编码与码率控制知识体系 视频编码与码率控制知识体系 H.264 / H.265 GOP 结构 I 帧 P 帧 B 帧 IDR 帧间隔 CBR(恒定码率) VBR(可变码率) CRF(恒定质量) 直播 / 视频会议 点播 / 存储 存档 / 母版 选择原则:直播用 CBR,点播用 CRF,存档用低 CRF + 慢速 preset GOP 长度:直播 2~4 秒,点播 5~10 秒

3.6 避坑指南

最后分享几个我踩过的坑:

  • GOP 设太短:压缩率下降,码率飙升。我曾经为了「低延迟」把 GOP 设成 15 帧(0.5 秒),结果码率翻了一倍。
  • CRF 值设太低:CRF 18 以下基本看不出区别,但文件大小翻倍。我一般点播用 23,存档用 20。
  • 直播用 VBR:峰值码率可能把带宽打满,导致丢包。直播老老实实用 CBR。
  • B 帧开太多:解码器压力大,延迟高。直播场景建议 -bf 0 或 -bf 2。