视频编码基础回顾:YUV色彩空间、H.264/H.265编码原理、码率控制、GOP结构
做Camera编码这行,有些基础绕不过去。今天咱们就把视频编码的几个核心概念掰开揉碎聊一聊。YUV是什么、H.264和H.265怎么工作的、码率怎么控、GOP怎么设——这些搞明白了,后面讲高通平台编码器调优你才能听得进去。
YUV色彩空间:为什么Camera不用RGB?
很多人刚接触Camera时都会问:为什么不用RGB?显示器用RGB,摄像头传感器采集的也是RGB,怎么到了编码环节就变成YUV了?
说白了,人眼对亮度敏感,对色彩没那么敏感。YUV就是把亮度和颜色分开——Y存亮度,U和V存颜色差异。这样编码时可以对颜色信息做更多压缩,人眼还看不出来。
YUV采样格式对比
| 格式 | 亮度采样 | 色度采样 | 数据量 | 常见场景 |
|---|---|---|---|---|
| YUV 4:4:4 | 全采样 | 全采样 | 最大 | 专业调色、屏幕录制 |
| YUV 4:2:2 | 全采样 | 水平1/2 | 中等 | 广播级视频、高端Camera |
| YUV 4:2:0 | 全采样 | 水平1/2、垂直1/2 | 最小 | H.264/H.265编码、网络视频 |
我在项目中遇到过一件事:有个同事把Camera输出的YUV 4:2:0数据直接当RGB处理,结果颜色全乱了。嗯,这里要注意——高通平台的ISP输出通常是NV12格式(YUV 4:2:0的一种变体),编码器输入前一定要确认格式对齐。
个人经验:调试Camera编码时,我习惯先抓一帧原始YUV数据,用工具打开看看。如果图像正常但颜色不对,八成是YUV格式搞错了。别问我怎么知道的——踩过坑的人自然懂。
H.264/H.265编码原理:从帧内到帧间
视频编码的核心思想就四个字:去除冗余。空间冗余、时间冗余、统计冗余、视觉冗余——全给它去掉。
帧内预测:空间冗余的克星
H.264支持9种帧内预测模式,H.265扩展到35种。什么意思?就是拿周围已经编码的像素,预测当前块的内容。预测得越准,残差越小,码率就越低。
我刚开始做编码优化时,总觉得帧内预测没什么好调的。直到有一次在低码率场景下,画面出现明显的块效应——后来发现是帧内预测模式选择不够精细。H.265的35种模式不是摆设,该用就得用。
帧间预测:时间冗余的杀手
视频相邻帧之间变化很小。帧间预测就是找参考帧里的匹配块,只记录运动矢量和残差。H.264支持1/4像素精度运动估计,H.265支持1/8像素精度——精度越高,预测越准,但计算量也越大。
避坑指南:我曾经在移动平台上把运动估计搜索范围设得太大,结果编码一帧要几十毫秒,帧率直接掉到15fps。后来改成自适应搜索范围,根据运动剧烈程度动态调整,效果好了很多。记住——高通平台的硬件编码器有固定的搜索范围限制,别盲目设大。
变换与量化:DCT和QP
残差数据做DCT变换,把空间域的像素值变成频率域的系数。高频系数量化得狠一点,反正人眼不敏感。量化参数QP控制压缩强度——QP越大,压缩越狠,画质越差。
H.264的QP范围是0-51,H.265也是0-51。但同样的QP值,H.265的压缩率比H.264高30%-50%。
码率控制:CBR、VBR、CRF怎么选?
码率控制是编码器的大脑。它决定每一帧分配多少比特。选错了,要么画面糊,要么带宽爆。
| 模式 | 特点 | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| CBR(恒定码率) | 码率波动小,稳定 | 直播、视频通话 | 运动场景容易糊 |
| VBR(可变码率) | 码率波动大,画质好 | 本地录制、点播 | 峰值码率可能超限 |
| CRF(恒定质量) | 固定画质,码率自适应 | 后期处理、存档 | 实时编码慎用 |
我个人习惯在Camera实时编码场景用CBR。为什么?因为网络带宽是固定的,码率波动太大会导致卡顿。但CBR有个问题——运动剧烈时画面质量会下降。解决办法是配合场景检测,动态调整目标码率。
实战技巧:高通平台的编码器支持码率控制参数微调。我一般把初始QP设低一点(比如26),让编码器从高质量开始,再根据缓冲区状态调整。这样开头几帧画质好,用户体验更佳。
GOP结构:I帧、P帧、B帧的排列艺术
GOP就是一组连续的画面。结构怎么排,直接影响压缩效率和随机访问能力。
- I帧:关键帧,完整编码,不依赖其他帧。体积最大。
- P帧:前向预测,参考前面的I帧或P帧。体积中等。
- B帧:双向预测,参考前后帧。体积最小,但延迟大。
典型的GOP结构有几种:
- IPPP:只有I帧和P帧,延迟低,适合实时通信。
- IBBP:插入B帧,压缩率高,适合本地录制。
- IDR帧:特殊I帧,刷新解码器状态,用于随机访问。
GOP长度怎么设?我见过有人固定设30帧(1秒1个I帧)。但这样做有个问题——场景切换时,I帧之前的P帧质量会下降。我建议开启场景检测,检测到场景切换时自动插入IDR帧。
注意:B帧虽然压缩率高,但会引入编码延迟。做实时Camera编码时,我一般不用B帧,或者最多用1个B帧。高通平台的硬件编码器对B帧支持有限,用之前一定要查datasheet。
好了,基础部分就聊到这儿。YUV格式别搞错,编码原理要理解,码率控制选对模式,GOP结构根据场景定——这四个点吃透了,后面讲高通平台编码器配置和调优,你才能跟得上节奏。