H264码流分层
1.NAL层(主要用于网络传输)
Network Abstraction Layer,视频数据网络抽象层。
方便于在网络传输视频流,因为在网络传输时,经常出现丢包,延迟,乱序,如果只传输二进制的数据,如果出现了乱序,重传,丢包,则没有纠错的能力,有了NAL层之后,接收端就能根据这个NAL头判断出有没有丢失,有没有乱序,有没有重传。然后进行相应的处理,如重传某个包。
2.VCL层
Video Coding Layer,视频数据编码层。
帧内编码,帧间编码,熵编码打包成的数据就是这一层。(实际的图像数据)
VCL结构关系
1.每个被压缩后的视频帧是由一个或多个slice组成的,
(对于h264,一般一个帧由一个slice组成,但是也可以由多个slice组成,slice作用时将帧分成多个小条,方便网络传输,但是大多数一帧由一个slice组成)。
2.每个slice由多个宏块组成。默认16x16像素一个宏块。
码流的基本概念
1.SODB(string of Data Bits)
原始数据比特流(二进制数据串),长度不一定是8的倍数,故需要补齐。它是由VCL层产生的。
(帧内编码,帧间编码,熵编码出来的没有做任何处理的二进制数据串。这个数据串是以位码在一起的,因为一位一位的才能压缩的紧密,如果是按照字节,如果一个字节只用了前三位,后面五位空了都是0,那就浪费了很多空间,浪费了很多有效的数据,但是用位码在一起的时候长度很可能不是8的整数倍,计算机以字节为单位进行处理比较好处理,如果都是位来处理计算,计算机也很麻烦)。
按位计算。
2.RBSP (Raw Byte Sequence Payload)
让原始数据按照字节的顺序组装起来。
SODB + trailing bits
算法是如果SODB最后一个字节不对齐,则补1和多个0。
例:
(如果差三位,则补1个1,两个0)
(如果差五位,则补1个1和4个0)
按字节计算,分配内存也好分配了。
3.NALU
NAL Header(1 BYTE)+RBSP
所谓的NAL层就是1个byte的header+H264编码器编出的RBSP( 也就是VCL)
一个个NALU组成了H264 码流。