H264
H264数据结构:
在H264结构中,一个视频图像编码后的数据为一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏组成,一个宏块由16*16的YUV数据组成。宏块作为H264编码的基本单元。
1.VCL video coding layer 视频编码层。
2.NAL network abstraction lay 网络抽象层。
VCL是对狠心算法引擎,块,宏块及片的语法级别的定义,它最终输出编码完的数据。
NAL层定义片以上的语法级别(序列参数集和图像参数集,针对网络传输)
H264网络传输的结构:
H264子网络传输的是NALU,NALU的结构是NAL头+RBSP(视频编码数据),实际传输中的数据如图:
NALU头结构
长度1 BYTE
forbidden_bit(1bit):金志伟,初始值为0,当网络发现NAL单元比特错误时可设置该比特为1,以便接受方纠错或丢弃该单元。
nal_reference_bit(2bit):NAL重要性知识,标志NAL单元的重要性,值越大越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU。
nal_unit_type(5bit):知识NALU的类型,需要关注的类型 5 IDR , 6 视频序列解码的增强信息 7 SEI
序列参数集(SPS) 8图像参数集(PPS)
切片结构:
几种分包格式:
STAP(STAP-A/B)一个RTP包中携带多个NALU单元,这些NALU的时间戳都一直。
MTAP一个RTP包中携带多个NALU单元,这些NALU的时间戳都不一直。
FU(FU-A/B)一个NALU由多个RTP包携带。
FU-A封包
分包目的:图像经过编码器产生NALU后,其数据很可能大于UDP所能携带的最大负载长度(受MTU大小限制),所以一个NALU会被分到多个RTP包中携带。
FU indicator结构:
F: 指示NALU是否有错误
NRI:指示该NALU的正确性
TYPE:指示该NALU的分包模式,FU-A值为28.
FU header结构:
S标识开始,E标识结束,TYPE标识NALU类型。
H265
nal_uint_header(){
forbidden_zero_bit:1
nal_unit_type:u(6)
nuh_layer_id:u(6)
nuh_temporal_id_plus1:u(3)
}
NALU的类型,主要关注的类型:VPS32,SPS 33, PPS 34 IDR_W_RADL 19
·关注码流的顺序: VPS SPS PPS IDR(IDR_W_RADL)
FU-A
FU NAL HDR
结构等同于NALU header的,但是type字段与H264 FU indicator的type字段一样,指示的是封包方式FU-A 49 STAP 48
FU HEADER = H264