天天看点

五、H.264码流结构NAL Unit封装格式流格式详解代码提取NAL Unit

NAL Unit封装格式

  H.264的语法元素进行编码后,生成的输出数据都封装为NAL Unit进行传递,多个NAL Unit的数据组合在一起形成总的输出码流。对于不同的应用场景,NAL规定了一种通用的格式适应不同的传输封装类型。

  通常NAL Unit的传输格式分两大类:字节流格式和RTP包格式;

1、Annex B字节流格式:

  • 大多数编码器实现的默认输出格式
  • 以连续的bit字节的形式传输码流,因此每个NAL Unit以规定格式的起始码分割
  • 起始码:0x00 00 00 01或0x 00 00 01

2、RTP包格式:

  • 直接封装NAL Unit,无起始码
  • 每个NAL Unit之前以几个字节表示NAL Unit的长度
  • 按照RTP数据包的格式封装

流格式详解

1、流格式的H.264码流如下图:

  • 标准协议文档附录B
    五、H.264码流结构NAL Unit封装格式流格式详解代码提取NAL Unit
  • leading_zero_8bits:长度为一个字节的0

2、NAL Unit的字节流格式:

  • leading_zero_8bits:在第一个NAL单元之前的前缀0字节;
  • zero_byte:一个字节的0字符;
  • start_code_prefix_one_3bytes:3个字符的起始前缀符,值为0x 00 00 01,与zero_byte共同构成一个0x 00 00 00 01的前缀符;
  • nal_unit:表示一个NAL Unit的比特位;
  • trailing_zero_8bits:结束0字符;

3、H264码流头部解析

  • 查找start_code_prefix之间的数据,是为一个NAL Uint的有效数据
  • 如下图是一段H264码流的头部:
    五、H.264码流结构NAL Unit封装格式流格式详解代码提取NAL Unit
  • NAL Unit的实际内容为:67 42 00 1E F1 61 62 62
  • start_code_prefix:0x00 00 00 01或0x00 00 01

代码提取NAL Unit

对于字节流格式的H.264码流,从原始码流中读取NAL Unit的方法为检测两个起始码0x 00 00 01或0x 00 00 00 01之间的数据即可:

继续阅读