音视频 (一) —— H.264 中的 NAL 技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频 (一) —— H.264 中的 NAL 技术相关的知识,希望对你有一定的参考价值。

参考技术A 音视频 (一) —— H.264 中的 NAL 技术
音视频 (二) —— H.264中相关参数理解
音视频 (三) —— 视频相关参数的理解

NAL 全称 Network Abstract Layer,即网络抽象层。在 H.264/AVC 视频编码标准中,整个系统框架被分为 了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容, 而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。 现实中的传输系统是多样化的,其可靠性,服务质量,封装方式等特征各不相同,NAL 这一概念的提出 提供了一个视频编码器和传输系统的友好接口,使得编码后的视频数据能够有效地在各种不同的网络环境 中传输。

NAL 单元是 NAL 的基本语法结构,它包含一个字节的头信息和一系列来自 VCL 的称为原始字节序列载荷 (RBSP)的字节流。头信息中包含着一个可否丢弃的指示标记,标识着该 NAL 单元的丢弃能否引起错误 扩散,一般,如果 NAL 单元中的信息不用于构建参考图像,则认为可以将其丢弃;最后包含的是 NAL 单 元的类型信息,暗示着其内含有效载荷的内容。 送到解码器端的 NAL 单元必须遵守严格的顺序,如果应 用程序接收到的 NAL 单元处于乱序,则必须提供一种恢复其正确顺序的方法。

NAL 提供了一个编解码器与传输网络的通用接口,而对于不同的网络环境,具体的实现方案是不同的。 对于基于流的传输系统如 H.320、MPEG 等,需要按照解码顺序组织 NAL 单元,并为每个 NAL 单元增加 若干比特字节对齐的前缀以形成字节流;对于 RTP/UDP/IP 系统,则可以直接将编码器输出的 NAL 单元 作为 RTP 的有效载荷;而对于同时提供多个逻辑信道的传输系统,甚至可以根据重要性将不同类型的 NAL 单元在不同服务质量的信道中传输。

为了实现编解码器良好的网络适应性,需要做两方面的工作:第一、在 Codec 中将 NAL 这一技术完整而 有效的实现;第二、在遵循 H.264/AVC NAL 规范的前提下设计针对不同网络的最佳传输方案。如果实现 了以上两个目标,所实现的就不仅仅是一种视频编解码技术,而是一套适用范围很广的多媒体传输方案, 该方案适用于如视频会议,数据存储,电视广播,流媒体,无线通信,远程监控等多种领域。
NALU 类型
标识 NAL 单元中的 RBSP 数据类型,其中,nal_unit_type 为 1, 2, 3, 4, 5 的 NAL 单元称为 VCL 的 NAL
单元,其他类型的 NAL 单元为非 VCL 的 NAL 单元。
• 0:未规定
• 1:非IDR图像中不采用数据划分的片段
• 2:非IDR图像中A类数据划分片段
• 3:非IDR图像中B类数据划分片段
• 4:非IDR图像中C类数据划分片段
• 5:IDR图像的片段
• 6:补充增强信息(SEI)
• 7:序列参数集(SPS)
• 8:图像参数集(PPS)
• 9:分割符
• 10:序列结束符
• 11:流结束符
• 12:填充数据
• 13:序列参数集扩展
• 14:带前缀的NAL单元
• 15:子序列参数集
• 16–18:保留
• 19:不采用数据划分的辅助编码图像片段
• 20:编码片段扩展
• 21–23:保留
• 24–31:未规定
NAL 的头占用了一个字节,按照比特自高至低排列可以表示如下:
0AABBBBB
其中,AA 用于表示该 NAL 是否可以丢弃(有无被其后的 NAL 参考),00b 表示没有参考作用,可丢弃,如 B slice、SEI 等,非零——包括 01b、10b、11b——表示该 NAL 不可丢弃,如 SPS、PPS、I Slice、P Slice 等。 常用的 NAL 头的取值如:
由于 NAL 的语法中没有给出长度信息,实际的传输、存储系统需要增加额外的头实现各个 NAL 单元的定界。 其中,AVI 文件和 MPEG TS 广播流采取的是字节流的语法格式,即在 NAL 单元之前增加 0x00000001 的同步 码,则从 AVI 文件或 MPEG TS PES 包中读出的一个 H.264 视频帧以下面的形式存在:
而对于 MP4 文件,NAL 单元之前没有同步码,却有若干字节的长度码,来表示 NAL 单元的长度,这个长度 码所占用的字节数由 MP4 文件头给出;此外,从 MP4 读出来的视频帧不包含 PPS 和 SPS,这些信息位于 MP4 的文件头中,解析器必须在打开文件的时候就获取它们。从 MP4 文件读出的一个 H.264 帧往往是下面的形式 (假设长度码为 2 字节):
SPS 详析 PPS 详析 SEI 详析
NAL 在多媒体传输、存储系统中的应用
0x67 : SPS
0x68 : PPS
0x65 : IDR
0x61 : non-IDR Slice 0x01: B Slice
0x06 : SEI
0x09 : AU Delimiter
00 00 00 01 06 ... 00 00 00 01 67 ... 00 00 00 01 68 ... 00 00 00 01 65 ... SEI 信息 SPS PPS IDR Slice
00 19 06 [... 25 字节...] 24 aa 65 [... 9386 字节...] SEI 信息 IDR Slice。

音视频基础 (一) —— 视频中各种参数sps 、pps 、nalu、frame 、silce等 (二)

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

在上一节中通过一个小程序,可以提取NAL Unit所包含的的字节数据。H.264码流中的每一个NAL Unit的作用并不是相同的,而是根据不同的类型起不同的作用。下面将对NAL Unit中的数据进行解析。

一、NAL Unit结构

一个NAL Unit都是由一个NAL Header和一个NAL Body组成。对于基本版本的H.264标准(不考虑SVC和MVC扩展),一个NAL Header的长度固定为1,即8bit。这8bit的含义分别为:

  • forbidden_zero_bit:每一个NAL Header的第一个bit,规定必须为0;
  • nal_ref_idc:第2和3位,主要表示NAL的优先级。当该值为正时,表示当前NAL Unit中包含了SPS、PPS和作为参考帧的Slice等重要数据。
  • nal_unit_type:表示NAL Unit的类型,包括VCL层和非VCL层的多种数据类型。常见的nal_unit_type取值有:7表示SPS,8表示PPS,5表示IDR帧,1表示非IDR帧等。

技术分享图片

查询H.264文档7.3节,可以看到NAL Unit语法结构:
7.4节介绍了每一个语法结构的内容和作用
技术分享图片

二、NAL Unit的有效负载数据及其封装

在NAL Header之后,NAL Unit的其余部分,即NAL Body包含了有效负载数据的封装。从NAL Body到实际的语法元素的码流共3层封装:

第一层:EBSP——扩展字节序列载荷

EBSP全称为Extended Byte String Payload,等同于NAL Body的数据本身。在EBSP中包含了一个特殊的字节0x03,表示防止竞争校验字节:

emulation_prevention_three_byte:设置该值的目的是为了防止NAL Body内部出现于NAL Unit起始码0x 00 00 01或0x 00 00 00 01冲突。

当内部的连续4字节数据出现了下列情况时:
0x 00 00 00
0x 00 00 01
0x 00 00 02
0x 00 00 03

在两个0字节之后会插入值为3的一个字节,形成下列情况:
0x 00 00 03 00
0x 00 00 03 01
0x 00 00 03 02
0x 00 00 03 03

在进行解析时需要将附加的03字节去掉,得到RBSP数据。

第二层:RBSP——原始字节序列载荷

RBSP全称为Raw Byte Sequence Payload,相当于NAL Body去掉emulation_prevention_three_byte之后的数据,是对原始的语法元素码流进一步处理后产生的数据。

作用:字节对齐。
每一个NAL Unit都是紧密排列的,如果出现一个UAL unit字节没对齐,后面的就都对不齐,那就需要时刻进行数据位的对齐操作, 会对接收端和解码端造成极大的负担。

在语法元素编码后,并不一定占满了所有的比特,最后可能会空出几位来。为了补全一位数据,在RBSP在末尾添加了rbsp_trailing_bits()部分,其主要目的是字节对齐。

每个rbsp_trailing_bits()包括一个1bit和若干个0bit,0bit的个数不定,以实现字节的对齐。
例如:一个字节中前三位编码了语法元素1 0 1,后面还剩5位,需要补上1 0 0 0 0,凑成一个字节。
完整的一个字节为 1 0 1 1 0 0 0 0。

第三层:SODB——数据字节流

SODB全称为String Of Data Bits,表示H.264的语法元素编码完成后的实际的原始二进制码流。SODB通常不能保证字节对其。














以上是关于音视频 (一) —— H.264 中的 NAL 技术的主要内容,如果未能解决你的问题,请参考以下文章

低延时高RTSP兼容的EasyPlayer-RTSP-win解决H.264一帧多个nal单元录像花屏问题方案

H.264 NAL unit start code and NAL types

H264 NAL解析

视频编解码·学习笔记4. H.264的码流封装格式 & 提取NAL有效数据

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

H264的NAL介绍