有关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单元流可包含一个或更多的编码视频序列。
- 有关H.264中NAL的一些疑难点的解释
- H.264的NAL单元
- h.264中NAL
- 指针的疑难解释
- h.264/AVC的结构 NAL结构
- H.264中帧、片、宏块和NAL的关系
- H.264的NAL单元及码流结构
- H.264 中的 NAL 技术简单的介绍
- 一些跟网络有关的参数解释
- Android中获取坐标点的一些方法解释
- H.264 NAL detail
- 【H.264/AVC视频编解码技术详解】六、H.264的NAL解析
- 有关GPS的一些记录点
- 说说常见的几个js疑难点
- Android消息机制的疑难点说明
- H.264中有关句法元素描述子的总结
- 有关文件中DEBUG定义的解释!
- Cocos中有关九宫格的解释
- QSS快速安全设置
- Selenium学习笔记之003:Web UI自动化知识点整理
- Android开发中自定义Toast
- LeetCode OJ 之 Palindrome Linked List(回文链表判断)
- JSP九大内置对象和四种属性范围解读
- 有关H.264中NAL的一些疑难点的解释
- git ssh
- 满是坑的量子力学
- 磨刀也误砍柴工
- 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
- 使用thinkphp和php中的问题-preg_replace(), 链式查询
- 头痛究竟有危险吗?误区解读很重要!
- Android仿微信(四)——仿QQ登陆
- JAVA环境配置及第一个JAVA程序