音频编码和视频编码基础

  • 1 音频数字化
  • 1.1 PCM
  • 1.2 音频编码方式
  • 2 视频数字化
  • 2.1 RGB/YUV
  • 2.2 视频编码方式
  • 2.3 编码中的重要概念


1 音频数字化

1.1 PCM

音频裸数据就是PCM(Pulse Codec Modulation脉冲编码调制)
PCM数据涉及四个概念:
1、 sampleFormat(采样格式):可理解为一多少字节存储声音,典型的量化格式为16bit。
2、sampleRate(采样率):这就不用说了吧,典型的采样率为44.1KHz。
3、channel(声道数):为了造成立体声效果,数字声音分为左、右两个声道。
4、比特率:对于数字音频而言,比特率是个关键概念。定义为:一秒时间内的比特数,用于衡量单位时间音频数据量的大小。
音频:比特率(码率) = 采样率 * 采样精度 * 声道数目
视频:比特率 = 帧率 * 每帧数据大小
以FFmpeg中常见的PCM数据格式s16le为例:它描述的是有符号16位小端PCM数据。s表示有符号,16表示位深,le表示小端存储。
PCM数据流
通常我们会为buffer分配一个固定的长度,例如2048字节,通过循环的方式一边从文件中加载PCM数据,一边播放。
加载好PCM数据后,需要送到音频设备驱动程序中播放,这时我们应该能听到声音。与PCM数数据一同到达驱动程序的通常还有采样率(sample rate),用来告诉驱动每秒钟应该播放多少个采样数据。如果传递给驱动程序的采样率大于PCM实际采样率,那么声音的播放速度将比实际速度快,反之亦然。
对于多声道的PCM数据而言,通常会交错排列,就像这样:
±--------±----------±----------±----------±----------±—
FL | FR | FL | FR | FL |
±--------±----------±----------±----------±----------±—

1.2 音频编码方式

音频压缩技术

 目的/手段是:消除冗余数据。

 冗余数据包括:人耳听觉范围外的音频信号,以及被掩蔽掉的音频信号。

 信号的掩蔽分为:频域掩蔽和时域掩蔽。

 方法:哈夫曼无损编码。

audioTrack播放pcm digital audio format pcm_视频处理


audioTrack播放pcm digital audio format pcm_audioTrack播放pcm_02


音频编码过程

audioTrack播放pcm digital audio format pcm_audioTrack播放pcm_03


1、WAV编码

WAV为微软公司(Microsoft)开发的一种声音文件格式。

WAV编码有多种实现方式,其中一种实现是:在PCM数据格式前加上44字节,用于表示PCM的采样率、声道数、数据格式等。也就是,并不会对PCM数据进行压缩(所有实现都不压缩)。

 特点:音质好

 场合:用于多媒体开发的中间件、或音效素材。

2、MP3编码

MPEG-1 or MPEG-2 Audio Layer III是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III),简称为MP3,是目前最流行的音频编码格式。

同样MP3也有多种编码实现,其中LAME编码中的高码率文件,音效非常接近WAV。

 特点:码率128Kbit/s以上的音频上压缩比较高,兼容性好。

 场合:高比特率下,对兼容性有要求的音乐。+

3、AAC编码

AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术(PS,SBR),为区别于传统的MPEG-2 AAC,故含有SBR或PS特性的AAC又称为MPEG-4 AAC。

有损压缩技术,通过附加编码技术,有三种主要的版本:

 LC-AAC: 应用于中高码率场景(>= 80Kbit/s)

 HE-AAC:应用于中低码率场景(<= 80Kbit/s)

 HE-AAC v2: 应用于低码率场景(<=48Kbit/s)

 特点:在小于128Kbit/s码率下表现优异,常用于视频中的音频编码。

 场景:128Kbit/s下的音频编码,用于视频中的音频编码。

AAC的音频文件格式有ADIF & ADTS

ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。

audioTrack播放pcm digital audio format pcm_数据_04


ADIF的头信息:

audioTrack播放pcm digital audio format pcm_视频处理_05


ADIF头信息位于AAC文件的起始处,接下来就是连续的 raw data blocks。组成ADIF头信息的各个域如下所示:

audioTrack播放pcm digital audio format pcm_audioTrack播放pcm_06


ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。简单说,ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,目前一般编码后的和抽取出的都是ADTS格式的音频流。两者具体的组织结构如下所示:

audioTrack播放pcm digital audio format pcm_视频处理_07


图中表示出了ADTS一帧的简明结构,其两边的空白矩形表示一帧前后的数据。AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。

audioTrack播放pcm digital audio format pcm_音频编码解码_08


每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。

ADTS的固定头信息:

audioTrack播放pcm digital audio format pcm_音频编码_09


ADTS的可变头信息:

audioTrack播放pcm digital audio format pcm_视频处理_10


(1)帧同步目的在于找出帧头在比特流中的位置,13818-7规定,aac ADTS格式的帧头

同步字为12比特的“1111 1111 1111”。

(2)ADTS的头信息为两部分组成,其一为固定头信息,紧接着是可变头信息。固定头信息中的数据每一帧都相同,而可变头信息则在帧与帧之间可变。

AAC解码流程

audioTrack播放pcm digital audio format pcm_数据_11


在主控模块开始运行后,主控模块将AAC比特流的一部分放入输入缓冲区,通过查找同步字得到一帧的起始,找到后,根据ISO/IEC 13818-7所述的语法开始进行Noisless Decoding(无噪解码),无噪解码实际上就是哈夫曼解码,通过反量化(Dequantize)、联合立体声(Joint Stereo),知觉噪声替换(PNS),瞬时噪声整形(TNS),反离散余弦变换(IMDCT),频段复制(SBR)这几个模块之后,得出左右声道的PCM码流,再由主控模块将其放入输出缓冲区输出到声音播放设备。

输入为一个AAC原始码流(裸流)的文件路径,输出为该码流中ADTS frame的统计数据,如下图所示。

audioTrack播放pcm digital audio format pcm_audioTrack播放pcm_12


4、Ogg编码

OGG是一个自由且开放标准的容器格式,由Xiph.Org 基金会所维护,“Ogg”意指一种文件格式,可以纳入各式各样自由和开放源代码的编解码器,包含音效、视频、文字(像字幕)与元数据的处理。

一种非常好的编码,在各种码率下表现都十分优异,特别是低码率下。

 特点:可以用比MP3更小的码率实现比它更好的音质,中高码率编码表现也毫不逊色.但兼容性不好,不支持流媒体特性。

 场景:语音聊天。

2 视频数字化

2.1 RGB/YUV

 RGB
任何图像都可以由RGB组成。每个像素点的子像素有两种表示:
浮点表示:取值范围为0.0 ~ 1.0,常见于OpenGL中的子像素表示。
整数表示:取之范围为0 ~ 255或者00 ~ FF,8个bit表示一个子像素。常见的格式有RGBA-8888、Android平台上的RGB-565。
对于一般图像,通常使用整数表示。如计算一张分辨率为1280 * 720,格式为RGBA-8888的图像大小:1280 * 720 * 4 = 3.516MB
RGBA-8888格式:一个字节表示透明度三个字节表示RGB分量。
 YUV
对于视频而言,它的裸数据更多的使用YUV格式表示。和RGB比较,最大的优点在于占用较少的频宽(RGB要求三个独立的视频数据分量同时传输),另外YUV可以很好的向黑白电视兼容。其中:
Y :(拉丁文Luminance或Luma)表示亮度分量,通常称为亮度分量或者灰度。Y亮度分量的建立,是通过叠加RGB输入信号的特定部分完成。
U和V : 表示色度(Chrominance或Chroma),作用是描述色彩和饱和度,用于指定颜色。U和V色度分量,定义了色调和饱和度两方面,分别用Cr和Cb表示。Cr反映RGB输入信号红色部分和亮度值之间的差异。Cb则反映RGB输入信号蓝色部分和亮度值之间的差异。
YUV格式表示的数据,Y分量和U、V是分离的。只有Y分量的数据,表现出来就是黑白视频,这正是YUV格式能兼容黑白电视的原因。

2.2 视频编码方式

和音频数据相似,视频的编码也是通过去除冗余数据实现。不同数据在于,视频数据在时间和空间上有较强的相关性。所以这些冗余信息包括时间冗余和空间冗余。
 帧间编码
帧内编码用于去除时间冗余。关于帧间编码技术实现细节,可以先熟悉一下概念,暂时不用了解细节,这将在以后介绍。
帧间编码技术,是去除时间冗余的方式,包括以下方面:

  • 运动补偿: 通过之前的图像来预测、补偿当前图像,减少帧序列冗余信息。
  • 运动表示: 不同区域的图像需要使用不同的运动适量来描述运动信息。
  • 运动估计: 是一中从视频序列中抽取运动信息的一整套技术。
     帧内编码
    帧内编码用于去除空间冗余。关于帧内编码技术实现细节,可以先熟悉一下概念,暂时不用了解细节,这将在以后介绍。
    帧内编码编码标准有很多,且都需要大量篇幅介绍,这里只作大致介绍。一类是MPEG,主要包括四个版本:1、Mpeg1(用于VCD)。2、Mpeg2(用于DVD)。3、Mpeg4(现在流行的流媒体)。第二类是H.26*系列,包括H264。

2.3 编码中的重要概念

 IPB帧

I帧:帧内编码帧(intra picture),通常是每个GOP(MPEG使用的一种视频压缩技术)的第一帧,经过适当的压缩,作为随机访问的参考点,可以当作静态图像。I帧可以得到6:1的压缩比,而不造成图像模糊,可以去除空间冗余。I帧可理解为一张独立完整的视频画面,只是进行了空间冗余的压缩而已。

P帧:前向预测帧(predictive-frame),通过图像序列中,前面已编码帧的时间冗余信息的去除来压缩数据量的编码图像,也称为预测帧。P帧可理解为需要前一个I帧或P帧来解码才能得到一张完成视频画面。

B帧:双向预测内插编码帧(bi-directional interpolated prediction frame), 即考虑图像序列前已编码帧,也参照图像序列后已编码帧的时间冗余信息,来压缩数据量,也称为双向预测帧。B帧可理解为需要曹考前一个I帧或P帧,以及后一个P帧生成一张完整的视频画面。

IDR帧:(instantaneous decoding refresh picture),在H264编码中出现的概念,类似I帧,区别在于:H264采用多帧预测,I帧之后的P帧可能参考I帧之前的帧才能解析完整图像,所以在随机访问中,就不能以I帧作为参考条件。而IDR帧就是一种特殊的I帧,这一帧后的所有帧只会参考它,而不会参考前面的帧。在编码器中,一旦接收到一个IDR帧,就会立即清理参考帧缓冲区,并将这个IDR帧作为参考帧使用。

 GOP

英文全称为Group Of Picture,意思是,两个I帧之间形成的一组图片。通常在为解码器设置参数时,需要指定gop_size的值,因为I帧的压缩率是最低的,对一个视频源而言,gop_size越大,相对来说I帧就越少,节约出来的空间就可以保存更多的I帧,所以画质就会越好。所以,应该根据业务场景,选择适当的gop_size值,从而提高视频质量。

常见的压缩率:

I帧:7

P帧:20

B帧:50

 H264

H264的相关概念有:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。

audioTrack播放pcm digital audio format pcm_视频处理_13


H.264的主要目标有两个:高视频压缩比、良好的网络亲和性。为此,H.264的功能分为两层,即视频编码层(VCL)和网络提取层(NAL,Network Abstraction Layer)。VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL Unit中。每个NAL Unit包括一个原始字节序列负荷(RBSP)、一组对应于视频编码数据的NAL头信息:

audioTrack播放pcm digital audio format pcm_数据_14


NAL Unit的头占一个字节,由三部份組成,包括forbidden_bit、nal_reference_idc和 nal_unit_type。其中forbidden_bit占1 bit,一般来说其值为0;nal_reference_idc占2 bit,用于表示此NAL在重建过程中的重要程度。剩下5 bit表示nal_unit_type,用于表示该NAL Unit(RBSP)的类型。

举例来说,若截取某一段 H.264 bitstream为00 00 00 01 67 42 e0 14 da 05 82 51。其中 00 00 00 01为startcode(起始码),每个NALU之间通过startcode进行分隔。之后才是NAL 的数据,因为67 = 0 11 00111,nal_unit_tye = 00111 = 7,所以这一段为SPS。SPS信息在整个视频编码序列中是不变的,用于描述一个视频编码序列;PPS 信息在一幅编码图像之内是不变的,用于描述一个或多个独立的图像。SPS、PPS 的作用是防止在某些数据丢失后,整幅图像都受到影响的情况。

一个视频图像可编码成一个或更多个片(Slice):

audioTrack播放pcm digital audio format pcm_音频编码解码_15


每片包含整数个宏块(Marco Block,以下简称MB),即每片至少一个MB,最多时每片包含整个图像的宏块。设片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。

一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。每个图象中,若干宏块被排列成片的形式。I片只包含I宏块,P片可包含P和I宏块,而B 片可包含B和I宏块。

audioTrack播放pcm digital audio format pcm_音频编码_16


 SPS、PPS

H.264 引入了参数集的概念,每个参数集包含了相应的编码图像的信息。序列参数集 SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及参考帧数目、解码图像尺寸等等。图像参数集 PPS 对应的是一个序列中某一幅图像或者某几幅图像 ,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、片组数目等等。

通常,SPS和PPS在片的头信息和数据解码前传送至解码器。每个片的头信息对应一个pic_parameter_set_id,PPS被其激活后一直有效到下一个PPS被激活;类似的,每个PPS对应一个 seq_parameter_set_id,SPS被其激活以后将一直有效到下一个SPS被激活。

参数集机制将一些重要的、改变少的序列参数和图像参数与编码片分离,并在编码片之前传送至解码端,或者通过其他机制传输。