1.为什么要对视频进行编码
视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像,由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频,这么多连续的图像数据如果不经过编码则数据量太大了。
2.H.264编码框架
H.264码流文件分为两层
(1)VCL(Video Coding Layer,视频编码层): 负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。
(2)NAL (Network Abstraction layer,网络提取层): 负责以网络所要求的恰当的方式对数据进行打包和传送,是传输层。I不管在本地播放还是网络播放,都要通过这一层来传输。
VCL就是被压缩编码后的原始数据
将VCL数据封装到NAL单元中,才可以用于传输和存储
3.H.264码流分析
一般H.264编码器的默认输出为:起始码+NAL单元(NALU)。起始码为:0x00000001或者0x000001
(1)NAL单元
H.264的编码视频序列包括一系列的NAL单元。
一个NAL单元=一个原始字节序列负载(RBSP)+一个对应于视频编码的NAL头文件。
H.264码流NAL单元序列如图
(2)NAL Header
通过解析NAL头部,可以确定每个NAL单元的帧类型IPB帧。
l帧:帧内编码帧,关键帧,l帧可以看作一个图像经过压缩之后的产物,可以单独解码出一个完整的图像。
P:前向预测编码,记录了本帧跟之前的一个关键帧(或P)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
B帧:双向预测编码帧,记录了本帧与前后帧的差别,解码需要参考前面一个I帧或者P帧,同时也需要后面的P帧才能解码一张完整的图像。
NAL头的组成:
NAL头由一个字节组成,如下所示:
语法:禁止位(1位)、重要性指示位(2位)、NALU类型(5位)。
|0|1|2|3|4|5|6|7|
|F|NRI| Type|
NAl头信息的每一位说明如表所示
位 | 0 | 1~2 | 3~7 |
简称 | F | NRI | TYPE |
全称 | forbidden_zero_bit | nal_ref_idc | nal_unit_type |
中文 | 禁止位 | 重要性指示位 | NALU类型 |
作用 | 当网络发现NAL单元有比特错误时,可设置该比特为1,以便接收方丢掉该单元 | 标志该NAL单元用于重建时的重要性,值越大,越重要,取值为00~11 | 1~23表示单个NAL包,24~31需要分包或者组合发送。 |
nal_unit_type取值的含义如下:
(3)原始字节序列负载(RBSP)
每个NAL单元包含一个RBSP。典型的RBSP单元序列如图
每个单元都独立的NAL单元传送。NAL单元的信息头(1字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。
RBSP各部分的解释:
RBSP | 描述 |
参数集PS | 序列的全局参数 |
增强信息SEI | 视频序列解码的增强信息 |
图像定界符 | 视频图像的边界 |
编码 | 片(Slice)的头信息和数据 |
数据分割 | DP片层的数据,用于错误恢复解码 |
序列结束符 | 表明下一图像为IDR图像 |
流结束符 | 表明该流中已没有图像 |
填充数据 | 元数据,用于填充字节 |
片(Slice):
一帧图片经过 H.264 编码器之后,就被编码为一个或多个片 (slice),每片包含整数个宏块(至少一个宏块,最多包含整个图像宏块),NAL单元就是装载着这些片 (slice)的载体。
片的语法结构:片头规定了片的类型,属于哪个图像、有关的参考图像等;片的数据包含了一系列宏块和不编码数据。
4.H.264编码原理
H.264编码的原理是通过利用帧内和帧间的相关性、运动估计、变换、量化和熵编码等技术来减小视频数据的体积,从而实现高效的视频压缩。解码器在接收到H.264编码的视频流后,通过反向过程将其还原为可视的视频序列,以实现视频的播放和显示。