H.264的码流封装格式
在H.264语法元素进行编码之后,生成的输出数据都封装为NALU(nal unit)进行传递。多个NALU组合在一起就形成了输出码流
对于不同的应用场景,NALU规定了一种通用的格式来适应不同类型的传输封装类型,一般分为两大类:
-
Annex-B字节流格式
-
- 大部分编码器的默认输出格式
-
- 每个NAL Unit以规定格式的起始码分割
-
- 起始码:0x 00 00 00 01 或 0x 00 00 01
-
RTP数据包格式
-
- 直接封装NAL Unit,无起始码(封包时有长度信息)
-
- 每个NAL Unit之前以几个字节表示NAL Unit的长度
NAL Unit字节流格式
再标准协议文档中,定义在Annex B - Byte stream format
中
下图中就是NAL Unit的语法
-
leading_zero_8bits——f(8)
表示长度为一个字节的前导0,即0x00,长度固定为8bit。 -
——f(8)如果后面的24bit不为0x00 00 01的话,接下来的就是一个字节的0数据即0x00。
-
start_code_prefix_one_3bytes——f(24)
表示长度是三个字节的整数1,即0x00 00 01,长度固定为24bit -
nal_unit(NumBytesInNALunit)
nal unit的实际数据 -
trailing_zero_8bits——f(8)
末尾的0数据,一个字节0x00
NAL Unit提取方法
- 查找
start_code_prefix
之间的数据,也就是0x00 00 00 01或0x00 00 00 01之间的数据即可
检验
视频编解码——使用H.264视频编解码器JM进行YUV图像序列的编解码
这篇文章中使用JM将yuv编成h.264。
使用notebook打开.264
文件
可以看到,码流是以00 00 00 01开始的,在一个NAL Unit后,以第二个00 00 00 01开始第二个NAL Unit