<4>、NAL Unit
一个 H264 的帧至少由一个切片组成,不能没有切片,可以是一个到多个。
在网络传输的时候一个 H264 帧可能需要切开去传,一个一次传不完,这就按照切片来切。
每一个切片组成一个 NAL Unit。
<5>、切片与宏块的关系
在切片数据中,包含若干个宏块。
在一个宏块中,又包含了宏块类型、宏块预测、残差数据。
<6>、H264 的 NAL 单元与片、宏之间的联系
- 1 帧(一幅图像)= 1~N 个片(slice) //也可以说 1 到多个片为一个片组
- 1 个片 = 1~N 个宏块(Marcroblock)
- 1 个宏块 = 16X16 的 YUV 数据(原始视频采集数据)
从数据层次角度来说,一幅原始的图片可以算作广义上的一帧,帧包含片组和片,片组由片来组成,片由宏块来组成,每个宏块可以是 44、88、16*16 像素规模的大小,它们之间的联系如图所示。
同时有几点需要说明一下,这样能便于理解 NAL 单元:
- 如果不采用 FMO(灵活宏块排序)机制,则一幅图像只有一个片组;
- 如果不使用多个片,则一个片组只有一个片;
- 如果不采用 DP(数据分割)机制, 则一个片就是一个 NALU,一个 NALU 也就是一个片。否则,一个片的组成需要由 三个 NALU 组成,也就是上面说到的 A、 B、 C 类数据块
这时候在看下面这幅码流数据分层, 下图就比较能理解整体的码流结构组成了
如我们所见,每个分片也包含着头和数据两部分;分片头中包含着分片类型、分片中的宏块类型、分片帧的数量以及对应的帧的设置和参数等信息;而分片数据中则是宏块,这里就是我们要找的存储像素数据的地方,宏块是视频信息的主要承载者,因为它包含着每一个像素的亮度和色度信息。
视频解码最主要的工作则是提供高效的方式从码流中获得宏块中的像素阵列。宏块数据的组成如下图所示:
从上图中,可以看到,宏块中包含了宏块类型、预测类型、Coded Block Pattern、Quantization Parameter、像素的亮度和色度数据集等等信息。
需要注意的几点:
H.264/AVC 标准对送到解码器的 NAL 单元顺序是有严格要求的,如果 NAL 单元的顺序是混乱的,必须将其重新依照规范组织后送入解码器,否则解码器不能够正确解码。
序列参数集(sps)NAL 单元必须在传送所有以此参数集为参考的其他 NAL 单元之前传送,不过允许这些 NAL 单元中间出现重复的序列参数集 NAL 单元。所谓重复的详细解释为:序列参数集 NAL 单元都有其专门的标识,如果两个序列参数集 NAL 单元的标识相同,就可以认为后一个只不过是前一个的拷贝,而非新的序列参数集。
图像参数集(pps)NAL 单元 必须在所有以此参数集为参考的其他 NAL 单元之前传送,不过允许这些 NAL 单元中间出现重复的图像参数集 NAL 单元,这一点与上述的序列参数集NAL 单元是相同
三、AAC 编码基础
AAC 是高级音频编码(Advanced Audio Coding)的缩写,AAC 是新一代的音频有损压缩技术
1、AAC 编码的特点
AAC 是一种高压缩比的音频压缩算法,但它的压缩比要远超过较老的音频压缩算法,如 AC-3、MP3 等。并且其质量可以同未压缩的 CD 音质相媲美。
同其他类似的音频编码算法一样,AAC 也是采用了变换编码算法,但 AAC 使用了分辨率更高的滤波器组,因此它可以达到更高的压缩比。
AAC 使用了临时噪声重整、后向自适应线性预测、联合立体声技术和量化哈夫曼编码等最新技术,这些新技术的使用都使压缩比得到进一步的提高。
AAC 支持更多种采样率和比特率、支持 1 个到 48 个音轨、支持多达 15 个低频音轨、具有多种语言的兼容能力、还有多达 15 个内嵌数据流。
AAC 支持更宽的声音频率范围,最高可达到 96kHz,最低可达 8KHz,远宽于 MP3 的 16KHz-48kHz 的范围。
不同于 MP3 及 WMA,AAC 几乎不损失声音频率中的甚高、甚低频率成分,并且比 WMA 在频谱结构上更接近于原始音频,因而声音的保真度更好。专业评测中表明,AAC 比 WMA 声音更清晰,而且更接近原音
AAC 采用优化的算法达到了更高的解码效率,解码时只需较少的处理能力。
2、AAC 音频文件格式
①、ACC 音频文件格式类型
AAC 的音频文件格式有:ADIF,ADTS
ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。 故这种格式常用在磁盘文件中。
ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于 mp3 数据流格式。
简单说,ADTS 可以在任意帧解码,也就是说它每一帧都有头信息。ADIF 只有一个统一的头,所以必须得到所有的数据后解码。这两种的 header 的格式也是不同的,一般编码后的和抽取出的都是 ADTS 格式的音频流。
AAC 的 ADIF 文件格式如下图:
AAC 的 ADTS 文件中一帧的格式如下图:
②、ADIF 的 Header 结构
ADIF 的头信息如下图:
ADIF 头信息位于 AAC 文件的起始处, 接下来就是连续的 Raw Data Blocks。
组成 ADIF 头信息的各个域如下所示:
③、ADTS 的 Header 结构
ADTS 的固定头信息:
ADTS 的可变头信息:
- 帧同步目的在于找出帧头在比特流中的位置,13818-7 规定,AAC ADTS 格式的帧头同步字为 12 比特的“1111 1111 1111”。
- ADTS 的头信息为两部分组成,其一为固定头信息,紧接着是可变头信息。固定头信息中的数据每一帧都相同,而可变头信息则在帧与帧之间可变。
④、AAC 元素信息
在 AAC 中,原始数据块的组成可能有六种不同的元素:
SCE: Single Channel Element 单通道元素。单通道元素基本上只由一个 ICS 组成。一个原始数据块最可能由 16 个 SCE 组成。
CPE: Channel Pair Element 双通道元素,由两个可能共享边信息的 ICS 和一些联合立体声编码信息组成。一个原始数据块最多可能由 16 个 SCE 组成。
CCE: Coupling Channel Element 藕合通道元素。代表一个块的多通道联合立体声信息或者多语种程序的对话信息。
LFE: Low Frequency Element 低频元素。包含了一个加强低采样频率的通道。
DSE: Data Stream Element 数据流元素,包含了一些并不属于音频的附加信息。
PCE: Program Config Element 程序配置元素。包含了声道的配置信息。它可能出现在 ADIF 头部信息中。
FIL: Fill Element 填充元素。包含了一些扩展信息。如 SBR,动态范围控制信息等。
⑤、AAC 文件处理流程
(1)判断文件格式, 确定为 ADIF 或 ADTS
(2)若为 ADIF,解 ADIF 头信息,跳至第 6 步
(3)若为 ADTS,寻找同步头
(4)解 ADTS 帧头信息
(5)若有错误检测,进行错误检测
(6)解块信息
(7)解元素信息
3、编码算法处理流程
首先对输入的 PCM 信号分段,每帧每声道 1024 个样本,采用 1/2 重叠,组合得到 2048 个样本。
加窗后,进行离散余弦变化(MDCT),输出 1024 个频谱分量,依据不同采样率和变换块类型划分成 10 个不同带宽的比例因子频带。其中变化块类型由 心理声学模型 计算分析得到,该模型还将输出 信掩比,用于后续模块的处理。
AAC 还使用了一种新的称为时域噪声整形的技术,简称为 TNS。TNS 的作用机理在于利用了时域和频域信号的对偶性
量化和编码使用一种两层嵌套循环算法,以权衡码率和失真之间的矛盾。最后,进行比特流封装,得到压缩后的码流。