音频编码和视频编码基础

147 阅读3分钟

编码是隐匿在计算机软硬件背后的语言,是计算机的灵魂。

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编码框架分两层:

  1. VCL(Video Coding Layer):负责高效的视频内容表示;
  2. 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,包括:

  1. 配置/等级(Profile/Level)
  2. 颜色位深(Color depth)
  3. 分辨率
  4. SAR/DAR
  5. 帧率(Framerate)

3.2 IDR帧

接下来,我来介绍一下IDR帧。

GOP (Group of Frame)

  1. 一个GOP是一组连续的画面,包含I帧/B帧/P帧
  2. 在一个GOP内I frame解码不依赖任何的其它帧
  3. 两个IDR帧之间的区间

IDR (Instantaneous Decoding Refresh)

  1. 一个GOP内的第一个I帧
  2. 解码器遇到IDR帧会丢弃之前缓存的解码帧信息

4.总结

本来打算对音频编码和视频编码进行更为详细的介绍,不过我写着写着发现,掘金里有些大神写的更加详细-_-

这里就只对必要的知识点进行了梳理。