网络适配层的主要任务是对视频压缩后的数据进行划分和封装,并进行毕要的标识。
网络适配层:
将编码好的数据进行:划分、封装、标识,从而适应网络。
视频编码完是VCL层,然后去NAL层包装成各个NALU,再去网络中传输。
一、HEVC分成VCL和NAL两层。
VCL(视频编码层)就是传统的视频编码处理
NAL(网络适配层)就是把编码后的数据传输到网络上去
我是这样理解:VCL=应用层 NAL=IP/TCP层 所以应用层高于网络层
为了适应不同的网络环境和应用需求,NAL上的数据流由一个一个的NALU(NAL单元)构成,网络只需要NALU及其标识就可以优化视频传输性能。(可以理解为IP数据报)
**
NALU的组成:
**
NALU头:为固定的两个字节,承载NALU载荷的内容特征,如被参考的图像数据,部分参数集信息,序列结束信息等。
NALU载荷(即经过冲突避免的RBSP):NALU负载长度为整数字节,承载视频压缩后的原始字节序列载荷(Raw Byte
Sequence Payload,RBSP)。RBSP是对视频编码后的原始比特流片段SODB(STring OF Data Bits)进行添加尾部(添加结尾比特1,以凑足整字节)的包装。RBSP可以包含一个SS的压缩数据,VPS、SPS、PPS、补充增强信息等,也可以为定界、序列结束、比特流结束、填充数据等。
RBSP(视频压缩后的原始字节序列载荷)=SODB(视频编码原始比特流信息)+尾部
NALU的分类:
VCLU:封装一个slice
segment的编码数据的NALU,承载视频片压缩数据;
**node-VALU:**承载其它信息的压缩数据的NALU,封装VPS、SPS、PPS、slice头部信息的NALU;
图像类型
视频中会存在随机接入点IRAP,从IRAP开始,后续视频流(播放顺序在IRAP后面的图像)可以独立正确编码,无需参考IRAP前面的图像,IRAP的第一个图像称为IRAP图像!
1、解码顺序在IRAP前面,但是播放顺序在其后的图像称为IRAP图像的前置(Leading)图像
2、解码顺序在IRAP后面,播放顺序在其后(这是必定的)的图像称为IRAP图像的的后置(Trailing)图像
3、IRAP图像必须是I帧(但是I帧不一定是IRAP图像)
4、前置图像分成两种:
(1)RADL图像。它不依赖IRAP前面的码流信息
(2)RASL图像。它依赖IRAP前面的码流信息
5、有三种IRAP图像
(1)IDR图像。IDR图像及其后面的图像不参考IRAP前面的码流,换句话说IDR图像后面不允许包含RASL图像
(2)CRA图像。CRA图像运行前置图像可以是RASL图像(但是,无法正确解码)
(3)BLA图像。如果指定CRA图像后面的RASL图像可以被丢弃(因为无法解码),那么这种CRA图像就是BLA图像
6、IRAP图像把视频流分成多个相对独立的区域,叫做CVS(也叫GOP),如果IRAP图像是IDR图像,那么GOP就是封闭的GOP,否则是开放的GOP
图像2为IRAP图像(只包含帧内编码片,不采用帧间预测技术)
图像5是图像2的前置图像
图像8是图像2的前置图像
图像5是图像2的RADL图像
图像3是图像2的RASL图像
播放顺序在图像2后的图像属于另一段码流,从图像2介入视频流时,其RASL图像肯定无法正确解码,为方便处理,此时CRA图像被定义为BLA图像,即明确RASL图像不需要解码。
时域层
时域层的作用就是为了标记图像的重要性,在网络比较差的时候,有些不重要的图像往往可以被丢弃。层数越高越不重要,层数越低越重要。共有七层(0~6)
1、下切换,从任何图像开始,把更高层的图像丢弃
2、上切换,从任意图像开始,接收处理更高层的图像
3、对于满足上切换的图像,应该使用sps_temporal_id_nesting_flag标记(值为1)。HEVC定义了两种新的图像类型:TSA和STSA图像用于标识切换点(上切换)。
(1)STSA图像表示从该图像可以切换到该图像所属的时域层
(2)TSA图像表示从该图像可以切换到时域层标识号大于或等于该图像时域层的时域层。
NALU介绍
1、NALU中的数据部分需要整字节化(因为数据可能不足整数个字节),即在真实的数据后面添加一个比特1(称为停止比特),如果不足整数个字节,那么需要补充比特0,这些总称为RBSP数据(真实数据+比特1+若干比特0)
2、RBSP数据仍然不能作为NALU的载荷,因为0x000001是NALU的起始码,0x000000是NALU的结束码,因此需要对RBSP的数据进行转换,才能作为NALU的载荷
3、NALU由四个部分构成:
(1)1个比特的forbidden_zero_bit,值是1
(2)6比特的nal_unit_type
(3)3比特的nuh_layer_id,取值为0
(4)3比特的nuh_layer_plus1,该值减去1表示NALU所在的时域层
4、NALU单元的顺序和解码顺序一致,接入单元AU是多个按解码顺序排列的NALU,这些NALU解码后恰好生成一个图像。
(1)一个AU包含一帧图像所有的VCLU,还可以包含non-VCLU
(2)一般情况下,基本的AU不包含下面的NALU:参数集、保留的VCL、填充、保留non-VCLU、未明确等
(3)当下面的NALU出现的时候,表示一个新的AU的开始:
①VPS的NALU
②SPS的NALU
③PPS的NALU
④前置SEI NALU
⑤nal_unit_type取值为RSV_NVCL41到RSV_NVCL44之间的NALU
⑥定界NALU
⑦nal_unit_type取值为UNSPEC48到UNSPEC55之间的NALU
⑧编码图像的第一个VCLU(first_slice_segment_in_pic_flag等于1)
5、CVS就是一组按照解码顺序排列的AU,从NoRasOutputFlag=1的IRAP图像的AU到下一个NoRasOutputFlag等于1的AU(不包含它)
6、PPS包含了一个或多个图像共用的参数信息,SPS包含一个CVS共有的参数信息(被一个或多个PPS使用),VPS包含一个CVS共有的信息(被一个或多个SPS使用)
7、NALU流生成字节流的过程:
(1)在每个NALU前面插入3个字节的起始码start_code_prefix_one_3byte对应的值是0x000001
(2)如果NALU的类型是VPS_NUT,SPS_NUT、PPS_NUT或者帧的第一个NALU,那么在起始码前面再插入zaro_byte,值是0
(3)在视频流的首个NALU的起始码(可能包含zero_byte)前面插入leading_zero_8bits,值是0
(4)根据需要在每个NALU后增加trailing_zero_8bits,值是0
H.265码流:
视频编码输出的压缩数据比特流片段称为SODB(String Of Data Bits),它为最高位有效存储形式,也就是“我们编出来的东西”。
在SODB后添加RBSP载荷尾就生成了 RBSP(Raw Byte Sequence Payload,原始字节序列载荷),可以包含一个 SS 的压缩数据,也可以是 VPS、SPS、PPS 等信息。
RBSP前面加上NALU头信息就是一个NALU。若要形成码流,在NALU前加上开始码StartCodePrefix得到一段码流。
StartCodePrefix是开始码,标记一个NALU的开始。有以下两种方式: Annex B和HVCC,其中Annex
B在NALU前加0x000001或者0x00000001 ,HVCC则在NALU前加上指示其长度的前缀
NALU header: