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 知识体系总览
下面这张图把本章的核心逻辑串起来了。我建议你保存下来,以后调优时对照着看。
3.6 避坑指南
最后分享几个我踩过的坑:
- GOP 设太短:压缩率下降,码率飙升。我曾经为了「低延迟」把 GOP 设成 15 帧(0.5 秒),结果码率翻了一倍。
- CRF 值设太低:CRF 18 以下基本看不出区别,但文件大小翻倍。我一般点播用 23,存档用 20。
- 直播用 VBR:峰值码率可能把带宽打满,导致丢包。直播老老实实用 CBR。
- B 帧开太多:解码器压力大,延迟高。直播场景建议
-bf 0或-bf 2。