H.264 NAL unit start code and NAL types

Posted aspirs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H.264 NAL unit start code and NAL types相关的知识,希望对你有一定的参考价值。

H.264 NAL unit start code and NAL types

     

在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL占一个字节。

    NAL单元(NALU):NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷(RBSP)的字节流。 数据流是储存在介质上时: 每个NALU 前添加起始码:0x00000001(或者0x000001),用来指示一个 NALU的起始和终止位置。我们平时的每帧数据就是一个NAL单元(这个需要再确认)(SPS与PPS除外)。

    编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码。每个NAL前有一个起始码 0x00 00 01(或者0x00 00 00 01),解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办?H.264引入了防止竞争机制,如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:

0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303
解码器检测到0x000003时,把03抛弃,恢复原始数据(脱壳操作)。解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。

NALU头由一个字节组成, 它的语法如下:
      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+
F: 1 个比特.
  forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.
NRI: 2 个比特.
  nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如 00 的 NALU 解码器可以丢弃它而不影响图像的回放. 不过一般情况下不太关心
这个属性.
Type: 5 个比特.
 nal_unit_type. 这个 NALU 单元的类型. 简述如下:
0    没有定义
1     一个非IDR图像的编码条带 (bp帧)
slice_layer_without_partitioning_rbsp( )     
2     编码条带数据分割块A
slice_data_partition_a_layer_rbsp( )     
3     编码条带数据分割块B
slice_data_partition_b_layer_rbsp( )     
4     编码条带数据分割块C
slice_data_partition_c_layer_rbsp( )     
5     IDR图像的编码条带 (i帧)
slice_layer_without_partitioning_rbsp( )     
6     辅助增强信息 (SEI)
sei_rbsp( )     
7     序列参数集 (sps帧)
seq_parameter_set_rbsp( )     
8     图像参数集
pic_parameter_set_rbsp( pps帧)     
9     访问单元分隔符
access_unit_delimiter_rbsp( )     
10     序列结尾
end_of_seq_rbsp( )     
11     流结尾
end_of_stream_rbsp( )     
12     填充数据
filler_data_rbsp( )     
13     序列参数集扩展
seq_parameter_set_extension_rbsp( )     
14...18     保留     
19     未分割的辅助编码图像的编码条带
slice_layer_without_partitioning_rbsp( )     
20...23     保留     
24    STAP-A   单一时间的组合包
25    STAP-B   单一时间的组合包
26    MTAP16   多个时间的组合包
27    MTAP24   多个时间的组合包
28    FU-A     分片的单元
29    FU-B     分片的单元
30-31 没有定义

当遇到 00 00 00 01 67表示sps帧

当遇到 00 00 00 01 68 表示pps帧

from: http://blog.csdn.net/yuanbinquan/article/details/60148345

 

以上是关于H.264 NAL unit start code and NAL types的主要内容,如果未能解决你的问题,请参考以下文章

解析 H.264 NAL Unit 帧类型

H.264从SPS中提取视频宽高

视频编解码·学习笔记5. NAL Unit 结构分析

ffmpeg No start code is found ,Error splitting the input into NAL units.解决方案

ffmpeg No start code is found ,Error splitting the input into NAL units.解决方案

ffmpeg No start code is found ,Error splitting the input into NAL units.解决方案