H264视频传输、编解码----H264数据结构

H264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)。前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。这里,我们只关注NAL部分。

H264视频序列由一系列的NALU组成,一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示一个NALU的开始,必须是**“00 00 00 01” 或"00 00 01"**。每个NALU都会包含一个RBSP:
NALU序列
首先,我们先来分析NALU Header

NALU Header

NALU头由一个字节组成,它的语法如下:

  | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  | F |  NRI  |      Type         |

F: 1个比特.
forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.禁止位,0表示正常,1表示错误,一般都是0;
NRI: 2个比特.
nal_ref_idc. 取00~11,表示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放.
Type: 5个比特,重要
nal_unit_type. 这个NALU单元的类型.简述如下:

0         没有定义
1-23    NAL单元 单个 NAL 单元包,即一个NALU就能传输完成一帧H264.
24       STAP-A 单一时间的组合包
25       STAP-B 单一时间的组合包
26       MTAP16 多个时间的组合包
27       MTAP24 多个时间的组合包
28       FU-A 分片的单元
29       FU-B 分片的单元
30-31  没有定义

单个H264仅用1-23类型,24以后的用在RTP协议中 H264负载类型头中。再看一下1-23的类型:
H264视频传输、编解码----H264数据结构_第1张图片
真实的H264帧流一般是:
SEI + 序列参数集SPS + 图像参数集PPS + IDR帧+P帧+B帧…+ IDR帧+P帧+B帧…
这里写图片描述
00 00 00 01 06…00 00 00 01 67 … 00 00 00 01 68 …00 00 00 01 65 … 00 00 00 01 41…
  SEI信息               SPS                      PPS                       IDR Slice               非IDR Slice

其中SEI帧:包含了视频图像的信息
SPS和PPS帧:包含了视频解码器初始化需要的数据;常见的这种类型的H264开头有00 00 00 01 27/67… 00 00 00 01 28/68…
IDR帧:是主帧,也称关键帧,首先,这一帧可以单独解码出图像数据,包含了一帧图像完整的数据。然后,它还包含了后续若干非关键帧(大约5帧左右,也不一定)解码时所需要的重要信息。没有IDR帧的话,后面的非关键帧都无法解码。放在FFmpeg或者MediaCodec中都解码失败。
P帧或者B帧:对应着上面的type = 1;常见的这种类型的H264开头有00 00 00 01 21/61…
当然,传输过程中IDR帧有可能发生错误或者丢失,这样只会让它本身以及后面几个关联的P、B帧解码失败,而不会影响下一个IDR帧以及其后面的P、B帧的解码。这体现了H264良好的容错机制,错误的影响不会延续。
下面看一段真实的H264数据:
H264视频传输、编解码----H264数据结构_第2张图片
H264视频传输、编解码----H264数据结构_第3张图片

RBSP

其实就是数据部分,上面都已说明,根据NALU Header的type,RBSP有不同的意义,主要有SEI、SPS、PPS、IDR、P等。
另外,说下00 00 00 01和00 00 01两种Start Code的区别:区别主要是在H264传输过程中,有的H264数据帧超过MTU,需要分多包传输,
00 00 00 01:一帧完整的H264可以一包发送,或者,超过MTU需要分多包发送,第一个包就使用就是用00 00 00 01;
00 00 01 : 超过MTU需要分多包发送,非第一个包就使用就是用00 00 01;
在编码时如果遇到00 00 00 就会在后面添加一个03,防止Start Code和RBSP数据内容发生冲突。当然,解码时,解码器会自动将03去掉再进行解码。

H264特性

大体上把H264数据格式搞明白了,说一下它的特点:

  1. 具有很高的数据压缩比率,在同等图像质量的条件下,H.264 的压缩比是MPEG-2 的2 倍以上,是 MPEG-4的1.5~2 倍。
  2. 多平台适应性很强。

你可能感兴趣的:(h264传输-编解码,流媒体,H264)