
h264 Nalu 详解.docx
8页h264 Nalu 详解分类: 转 2012-02-15 12:45 800 人阅读 评论(1) 收藏 举报1.引言H.264 的主要目标:1.高的视频压缩比2.良好的网络亲和性解决方案:VCL video coding layer 视频编码层NAL network abstraction layer 网络提取层VCL:核心算法引擎,块,宏块及片的语法级别的定义NAL:片级以上的语法级别(如序列参数集和图像参数集),同时支持以下功能:独立片解码,起始码唯一保证,SEI 以及流格式编码数据传送VCL 设计目标:尽可能地独立于网络的情况下进行高效的编解码NAL 设计目标:根据不同的网络把数据打包成相应的格式,将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中NALU 头结构:NALU 类型(5bit)、重要性指示位(2bit)、禁止位(1bit)NALU 类型: 1~12 由 H.264 使用,24~31 由 H.264 以外的应用使用重要性指示:标志该 NAL 单元用于重建时的重要性,值越大,越重要禁止位:网络发现 NAL 单元有比特错误时可设置该比特为 1,以便接收方丢掉该单元。
2.NAL 语法语义NAL 层句法:在编码器输出的码流中,数据的基本单元是句法元素句法表征句法元素的组织结构语义阐述句法元素的具体含义分组都有头部,解码器可以很方便的检测出 NAL 的分界,依次取出 NAL 进行解码但为了节省码流,H.264 没有另外在 NAL 的头部设立表示起始位置的句法元素如果编码数据是存储在介质上的,由于 NAL 是依次紧密相连的,解码器就无法在数据流中分辨出每个 NAL 的起始位置和终止位置解决方案:在每个 NAL 前添加起始码:0X000001在某些类型的介质上,为了寻址的方便,要求数据流在长度上对齐,或某个常数的整数倍所以在起始码前添加若干字节的 0 来填充检测 NAL 的开始:0X000001 和 0X000000我们必须考虑当 NAL 内部出现了 0X000001 和 0X000000解决方案:H.264 提出了 “防止竞争”机制:0X000000——0X000003000X000001——0X000003010X000002——0X000003020X000003——0X00000303为此,我们可以知道:在 NAL 单元中,下面的三字节序列不应在任何字节对齐的位置出现0X0000000X0000010X000002Forbidden_zero_bit =0;Nal_ref_idc:表示 NAL 的优先级。
0~3,取值越大,表示当前 NAL 越重要,需要优先受到保护如果当前 NAL 是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于 0Nal_unit_type:当前 NAL 单元的类型3.H.264 的 NAL 层处理结构示意图:NAL 以 NALU(NAL unit)为单元来支持编码数据在基于分组交换技术网络中传输它定义了符合传输层或存储介质要求的数据格式,同时给出头信息,从而提供了视频编码和外部世界的接口NALU:定义了可用于基于分组和基于比特流系统的基本格式RTP 封装:只针对基于 NAL 单元的本地 NAL 接口三种不同的数据形式:SODB 数据比特串-->最原始的编码数据RBSP 原始字节序列载荷-->在 SODB 的后面填加了结尾比特(RBSP trailing bits 一个 bit“1”)若干比特“0”,以便字节对齐EBSP 扩展字节序列载荷在 RBSP 基础上填加了仿校验字节(0X03)它的原因是: 在 NALU 加到 Annexb 上时,需要添加每组 NALU 之前的开始码 StartCodePrefix,如果该NALU 对应的 slice 为一帧的开始则用 4 位字节表示,ox00000001,否则用 3 位字节表示ox000001.为了使 NALU 主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为 0,就插入一个字节的 0x03。
解码时将 0x03 去掉也称为脱壳操作处理过程:1. 将 VCL 层输出的 SODB 封装成 nal_unit, Nal_unit 是一个通用封装格式,可以适用于有序字节流方式和 IP 包交换方式2. 针对不同的传送网络(电路交换|包交换),将 nal_unit 封装成针对不同网络的封装格 式第一步的具体过程:VCL 层输出的比特流 SODB(String Of Data Bits),到 nal_unit 之间,经过了以下三步处理:1.SODB 字节对齐处理后封装成 RBSP(Raw Byte Sequence Payload)2.为防止 RBSP 的字节流与有序字节流传送方式下的SCP(start_code_prefix_one_3bytes ,0x000001)出现字节竞争情形,循环检测 RBSP前三个字节,在出现字节竞争时在第三字节前加入 emulation_prevention_three_byte (0x03 ),具体方法:nal_unit( NumBytesInNALunit ) {forbidden_zero_bitnal_ref_idcnal_unit_typeNumBytesInRBSP = 0for( i = 1; i < NumBytesInNALunit; i++ ) {if( i + 2 < NumBytesInNALunit && next_bits( 24 ) = = 0x000003 ) {rbsp_byte[ NumBytesInRBSP++ ]rbsp_byte[ NumBytesInRBSP++ ]i += 2emulation_prevention_three_byte /* equal to 0x03 */} elserbsp_byte[ NumBytesInRBSP++ ]}}3. 防字节竞争处理后的 RBSP 再加一个字节的 header(forbidden_zero_bit+ nal_ref_idc+ nal_unit_type),封装成 nal_unit.第二步的具体过程:case1:有序字节流的封装byte_stream_nal_unit( NumBytesInNALunit ) {while( next_bits( 24 ) != 0x000001 )zero_byte /* equal to 0x00 */if( more_data_in_byte_stream( ) ) {start_code_prefix_one_3bytes /* equal to 0x000001 */ nal_unit( NumBytesInNALunit )}}类似 H.320 和 MPEG-2/H.222.0 等传输系统,传输 NAL 作为有序连续字节或比特流,同时要依靠数据本身识别 NAL 单元边界。
在这样的应用系统中,H.264/AVC 规范定义了字节流格式,每个 NAL 单元前面增加 3 个字节的前缀,即同步字节在比特流应用中,每个图像需要增加一个附加字节作为边界定位还有一种可选特性,在字节流中增加附加数据,用做扩充发送数据量,能实现快速边界定位,恢复同步Case2: IP 网络的 RTP 打包封装分组打包的规则(1)额外开销要少,使 MTU 尺寸在 100~64k 字节范围都可以;(2)不用对分组内的数据解码就可以判别该分组的重要性;(3)载荷规范应当保证不用解码就可识别由于其他的比特丢失而造成的分组不可解码;(4)支持将 NALU 分割成多个 RTP 分组;(5)支持将多个 NALU 汇集在一个 RTP 分组中RTP 的头标可以是 NALU 的头标,并可以实现以上的打包规则一个 RTP 分组里放入一个 NALU,将 NALU(包括同时作为载荷头标的 NALU 头)放入RTP 的载荷中,设置 RTP 头标值为了避免 IP 层对大分组的再一次分割,片分组的大小一般都要小于 MTU 尺寸由于包传送的路径不同,解码端要重新对片分组排序, RTP 包含的次序信息可以用来解决这一问题NALU 分割对于预先已经编码的内容,NALU 可能大于 MTU 尺寸的限制。
虽然 IP 层的分割可以使数据块小于 64 千字节,但无法在应用层实现保护,从而降低了非等重保护方案的效果由于 UDP 数据包小于 64 千字节,而且一个片的长度对某些应用场合来说太小,所以应用层打包是 RTP 打包方案的一部分新的讨论方案(IETF)应当符合以下特征:(1)NALU 的分块以按 RTP 次序号升序传输;(2)能够标记第一个和最后一个 NALU 分块;(3)可以检测丢失的分块NALU 合并一些 NALU 如 SEI、参数集等非常小,将它们合并在一起有利于减少头标开销已有两种集合分组:(1)单一时间集合分组(STAP),按时间戳进行组合;(2)多时间集合分组(MTAP),不同时间戳也可以组合NAL 规范视频数据的格式,主要是提供头部信息,以适合各种媒体的传输和存储NAL 支持各种网络,包括:1.任何使用 RTP/IP 协议的实时有线和无线 Internet 服务2.作为 MP4 文件存储和多媒体信息文件服务3.MPEG-2 系统4.其它网NAL 规定一种通用的格式,既适合面向包传输,也适合流传送实际上,包传输和流传输的方式是相同的,不同之处是传输前面增加了一个起始码前缀在类似 Internet/RTP 面向包传送协议系统中,包结构中包含包边界识别字节,在这种情况下,不需要同步字节。
NAL 单元分为 VCL 和非 VCL 两种VCL NAL 单元包含视频图像采样信息,非 VCL 包含各种有关的附加信息,例如参数集(头部信息,应用到大量的 VCL NAL 单元)、提高性能的附加信息、定时信息等参数集:参数集是很少变化的信息,用于大量 VCL NAL 单元的解码,分为两种类型:1.序列参数集,作用于一串连续的视频图像,即视频序列两个 IDR 图像之间为序列参数集 IDR 和 I 帧的区别见下面2. 图像参数集,作用于视频序列中的一个或多个个别的图像序列和图像参数集机制,减少了重复参数的传送,每个 VCL NAL 单元包含一个标识,指向有关的图像参数集,每个图像参数集包含一个标识,指向有关的序列参数集的内容因此,只用少数的指针信息,引用大量的参数,大大减少每个 VCL NAL 单元重复传送的信息序列和图像参数集可以在发送 VCL NAL 单元以前发送,并且重复传送,大大提高纠错能力序列和图像参数集可以在“带内” ,也可以用更为可靠的其他 “带外”通道传送存储单元:一组指定格式的 NAL 单元称为存储单元,每个存储单元对应一个图像每个存储单元包含一组 VCL NAL 单元,组成一个主编码图像,VCL NAL 单元由表示视频图像采样的像条所组成。
存储单元前面可以加一个前缀,分界存储单元,附加增强信息(SEI)(如图像定时信息)也可以放在主编码图像的前面主编码图像后附加的 VCL NAL 单元,包含同一图像的冗余表示,称为冗余编码图像,当主编码图像数据丢失或损坏时,可用冗余编码图像解码编码视频序列一个编码视频序列由一串连续的存储单元组成,使用同一序列参数集每个视频序列可独立解码编码序列的开始是即时刷新存储单元(IDR )IDR 是一个 I 帧图像,表示后面的图像不用参考以前的图像一个 NAL 单元流可包含一个或更多的编码视频序列RTP 协议:实时传输协议(Real-time Transport Protocol,RTP)是在 Internet 上处理多媒体数据流的一种网络协议,利用它能够在一对一(单播)或者一对多(multicast,多播)的网络环境中实现传流媒体数据的实时传输RTP 通常使用 UDP 来进行多媒体数。












