我在今年年初离开 YOLO 加入了一家在流媒体领域具有极深积累的小公司,负责视频群聊 SDK 的开发工作,YOLO 是一款直播 APP,我常戏称这是从技术下游(SDK 使用方)跑到了技术上游(SDK 提供方)。不过事情当然不是这么简单,经过长期的思考和探讨,我最终确认:实时多媒体领域,更宽泛一点来讲,实时视觉、感知的展现,在未来极长一段时间内都存在很大的需求,也存在很大的挑战,所以这将是我长期技术积累的大方向。
明确了大方向之后,就需要不懈地积累了。我一直强调基础知识的重要性,最近我就花时间学习了 H.264 的基础(《新一代视频压缩编码标准:H.264/AVC(第2版)》),力求搞清楚两个问题:H.264 编解码的过程是怎样的?H.264 码流的结构是怎样的?
以前看书后分享的只是零碎的笔记,没敢发布博客,这一篇我力求根据自己的理解,把上述两个核心问题描述清楚,细节内容篇幅有限,就不做展开了。感兴趣的朋友可以阅读原书,当然,最正宗的资料莫过于 H.264 SPEC 了。本文使用的图片基本都是摘自《新一代视频压缩编码标准:H.264/AVC(第2版)》。
视频编解码基础
视频为什么需要编码?
因为原始视频数据量太大!
以分辨率为 640x480,帧率为 30 fps 的视频为例,如果直接传输/存储原始 RGB 数据,那码率将高达 210.94 Mbps(在专业领域码率单位通常使用 bit 而非 byte),1280x720 30 fps 码率更将高达 632.81 Mbps。
640*480*3*8*30 = 210.94 Mbps
(宽*高*像素字节数*字节比特数*帧数
)1280*720*3*8*30 = 632.81 Mbps
这么高的码率显然不能直接使用。即便换成更节省空间的 YUV 格式,无论是通过网络传输还是磁盘存储,码率依然高得不可接受,所以必须进行编码压缩。