有关H.264中NAL的一些疑难点的解释

来源:互联网 发布:新浪短网址api java 编辑:程序博客网 时间:2024/05/29 07:58

1,一个NAL单元和帧,片,参数集之间的关系如何?

   (1)一个NAL单元由NAL Header头部和RSBP(原始字节序列载荷)组成,在一个NAL单元中,RSBP的数据类型由nal_uint_type决定,其值范围为0-31。在一个NAL单元中,RSBP的数据类型一定是确定的,可以是序列参数集,可以是图像参数集,可以是片数据,但不管如何,一个NAL单元只能有一个数据类型,是唯一的。以下是视频数据在编码后码流跟踪文件中的一段


                       图1,这是一个NAL单元中RBSP的比特数据,其数据类型为SPS


     

                                  图2,NAL单元中RBSP数据类型为SPS。

  (2),在帧编码中,一帧可以分为多个片,一个片可以分成宏块,宏块又可以分成子宏块,通过对码流跟踪文件的分析发现,在帧编码的方式中,帧中的片数据对应着一个NAL单元。

(有不同意见和理解的,欢迎指正和交流)

2,对比分析编码过程中的跟踪文件和编码输出文件text.264,分析一个NAL单元中的字节流和编码后语法语素编码后的比特流之间的对应关系

       

              图3,这是编码端语法元素编码后的SODB(原始数据比特流),对应着第一个NAL单元。

    将图3中的比特串连起来:“01000010  00000000  00101000  11110011  00000101  10001001  1100”。

    最后一组比特不满一个字节,根据标准中规定的,将SODB封装成RSDP,即在最后一组比特后添加1000.

   这一比特串的十六进制值为:”42  00   28  F3  05  89  C8"

    

                   

              图4,这是用ultraedit打开的编码后码流文件text.264中开始一段码流

        在两个起始码0x000000001之间,对应的就是一个NAL单元。图4中的67是NAL单元的头部分:forbiden_bit(0),nal_reference_idc(11),nal_uint_type(00111)。 即01100111

3,为什么0x000000也可以作为当前NAL的结束标志?

     在老毕那本书中的解释是:这是因为连着的3个字节的0中的任何一个字节的0要么属于起始码,要么是起始码前添加的0。在老毕的书中有这么一段话:数据流存储在介质上时,在每个NAL前添加起始码:0x000001。在某些类型的介质上,为了寻址的方便,要求数据流在长度上对齐,或必须是某个常数的倍数。考虑到这种情况,H.264建议在起始码前添加若干字节的0来填充,直到该NAL的长度符合要求。要么属于起始码前添加的0,这是个可以理解的。

     可这里的一个问题就出来了,添加的起始码是0x000001,三个字节,0x000000是三个字节的0,其中的任何一个字节的0怎么会属于0x000001呢????如果说,0x000000中的后两个字节中的任何一个字节0属于0x000001,是可以理解的,除非起始码有四个字节的,即0x00000001,可起始码有四个字节的吗?(有对这个问题有很好的理解的吗?欢迎交流)

   在网上查找后的解释是:因为可能会填充bit 0,所以存在起始码前缀的表现形式为0x00000001或其他值,但必须包含0x000001.


4,对于“防止竞争”机制,为什么要对

     0x000000

     0x000001

     0x000002

     0x000003

    这四个字节序列进行改变?

   0x000000和0x000001可以作为NAL单元的结束标志,如果原始数据中存在0x000000和0x000001呢,那么解码器会将原始数据中的这两个值作为NAL单元的结束标志,实际上它并没有结束。所以需要对0x000000和0x000001进行改变,改变的方法是在最后一个字节前插入0x03. 在解码时遇到0x000003将它舍弃。当原始数据中有0x000003时,解码器也会将其舍弃,所以避免原始数据0x000003被舍弃,也需要在其最后一个字节前插入0x03。至于0x000002最后一个字节前被插入0x03的原因是作保留用,具体什么用途,不清楚。



5、存储单元

一组指定格式的NAL单元称为存储单元,每个存储单元对应一个图像。每个存储单元包含一组VCL NAL单元,组成一个主编码图像,VCL NAL单元由表示视频图像采样的像条所组成。存储单元前面可以加一个前缀,分界存储单元,附加增强信息(SEI)(如图像定时信息)也可以放在主编码图像的前面。

主编码图像后附加的VCL NAL单元,包含同一图像的冗余表示,称为冗余编码图像,当主编码图像数据丢失或损坏时,可用冗余编码图像解码。

6、编码视频序列

一个编码视频序列由一串连续的存储单元组成,使用同一序列参数集。每个视频序列可独立解码。编码序列的开始是即时刷新存储单元(IDR)。IDR是一个I帧图像,表示后面的图像不用参考以前的图像。一个NAL单元流可包含一个或更多的编码视频序列。



0 0