H264码流
H264码流分层
-
NAL层 Network Abstraction Layer,视频数据网络抽象层
在H264的整个分层中,第一层称为NAL层,这一层的作用主要是方便我们在网络上传输视频流。因为在网络上传递数据时,经常有丢包、延迟、乱序等现象,
而NAL层可以在接受段检测出这种不同的异常情况,然后进行处理,否则仅仅只是以byte数组进行传递时,一旦发生这种异常情况,我们是没有好的解决方法等。
例如丢包了,监测到后就可以知道丢了哪个包,可以让对方重新传输一个。
如果是乱序了,可以根据NAL层进行重新排序,NAL层虽然并没有直接序号,真正的序号是在RTP层,但是NAL层是知道包的起始和结束的,当知晓起始和结束后,配合RTP数据包的序号就可以知道这个数据在前面和后面。 -
VCL层 Video Coding Layer,视频数据编码层
这其实就是之前说的那些帧内编码、帧间编码等等产生的所有数据。
VCL结构关系
在视频帧内,每一幅图都是由许多的slice(片)组成的图片,也可以说是一幅图片是可以分很多slice的,在官方文档上这么叙述的。
在很多情况下,可能一个slice就对应整个图像,除非强制分成很多个slice。
每一个slice都是由很多小块组成的,每个小块都是宏块。
码流的基本概念
-
SODB (String Of Data Bits) 二进制数据串
原始数据比特流,长度不一定是8的倍数,故需要对齐,它是由VCL层产生的。
-
RBSP (Raw Byte Sequence Payload) 按字节存储的原始数据
SODB + trailing bits
算法是如果SODB最后一个字节不对齐,则补1和多个0
例如后面缺三位,则补一个1和两个0 -
NALU NAL单元
NAL Header(1B)+ RBSP
NAL Unit
H264切片
在规范中一个图像是可以很多slice,但是实际上一般只有一个,偶尔有两个,不会有很多的slice。
Slice 与 MacroBlock
MB部分指的是宏块,
mb_type 宏块类型
mb_pred 宏块预测值
coded residual 残差值
再次回顾码流分层
只是在网上传输时不包括StartCode,只传输NAL单元即RTP格式。
所以当涉及到将码流保存进图片时,需要加一个StartCode,只有这样播放器才可以将它正常播放出来。
存储文件时使用annexb格式,即StartCode+NAL单元
只网络传输时使用RTP格式,即只传输NAL单元