编码是隐匿在计算机软硬件背后的语言,是计算机的灵魂。
1.引言
自香农第一定理(可变长无失真信源编码定理)和香农第三定理(限失真信源编码定理)提出后,人们就开始不断寻找更优的信源编码方案。
声音和视频是两种重要的信源,下面将对声音和视频的编码方案进行一个简单的介绍。
对于音频编码,我将介绍AAC编码方案;对于视频编码,我将介绍H.264编码方案。
2.AAC
AAC对应的编码器可以将PCM裸流编码成AAC帧。
AAC音频数据有两种格式:
- ADIF(Audio Data Interchage Format),音频数据交换格式:只有一个统一的头,必须得到所有数据后解码,适用于本地文件。
- ADTS(Audio Data Transport Stream),音视数据传输流:每一帧都有头信息,任意帧解码,适用于传输流。
我们这里主要介绍ADTS。ADTS每一帧都有头信息:
...|ADTS Header|AAC ES|ADTS Header|AAC ES|ADTS Header|AAC ES|...
ADTS Header一般有7个或9个字节,由两部分组成:固定头信息(adts_fixed_header)、可变头信息(adts_variable_header),包含了采样率、声道数、帧长度的信息。
3.H.264
H.264,又称为MPEG-4第10部分,高级视频编码( MPEG-4 Part 10, Advanced Video Coding,缩写为MPEG-4 AVC)是一种面向块的基于运动补偿的编解码器标准。由ITU-T视频编码专家组与 ISO/IEC 联合工作组,即动态图像专家组( MPEG),联合组成的联合视频组( JVT, Joint Video Team) 开发。因ITU-T H.264标准和ISO/IEC MPEG-4 AVC标准有相同的技术内容,故被共同管理。
H.264编码框架分两层:
- VCL(Video Coding Layer):负责高效的视频内容表示;
- NAL(Network Abstraction Layer):负责以网络所要求的恰当的方式对数据进行打包和传送。
视频数据先在VCL层编码成数据比特串然后传送到NAL层编码成NALU序列。
在NAL层中,NALU(Network Abstract Layer Unit,网络抽象层单元)是H.264编码存储或传输的基本单位。NALU 的类型( nal_unit_type)包含(若数据不带时间戳,需要根据帧率计算):
- IDR (5);
- SPS(7)/PPS(8)
- SLICE/DPA/DPB/DPC 等
通常,数据的组织形式从大到小排序是:序列(sequence)、图像(frame/field-picture)、片组(slicegroup)、片(slice)、宏块(macroblock)、块(block)、子块(sub-block)、像素(pixel)。
在H.264码流中图像是以序列为单位进行组织的,一个序列是由多帧图像被编码后的数据流,以I帧开始,到下一个I帧结束;一帧图像可以分成一个或多个片(slice),片由宏块组成,宏块是编码处理的基本单位,当片编码之后会被打包进一个NALU,也就是一帧图像对应于一个NALU。
H264码流分两种组织方式,一种是AnnexB格式,一种是AVCC格式。必要时需要做转换。
3.1 SPS和PPS
接下来,我来介绍一下SPS和PPS。SPS(Sequence parameter set) 和 PPS(Picture parameter set) 是 H.264 中包含解码器需要的配置信息的NALU,包括:
- 配置/等级(Profile/Level)
- 颜色位深(Color depth)
- 分辨率
- SAR/DAR
- 帧率(Framerate)
3.2 IDR帧
接下来,我来介绍一下IDR帧。
GOP (Group of Frame)
- 一个GOP是一组连续的画面,包含I帧/B帧/P帧
- 在一个GOP内I frame解码不依赖任何的其它帧
- 两个IDR帧之间的区间
IDR (Instantaneous Decoding Refresh)
- 一个GOP内的第一个I帧
- 解码器遇到IDR帧会丢弃之前缓存的解码帧信息
4.总结
本来打算对音频编码和视频编码进行更为详细的介绍,不过我写着写着发现,掘金里有些大神写的更加详细-_-
这里就只对必要的知识点进行了梳理。