音视频基础概念

本文会记录一些音视频中常见的基本概念。音频技术是为了记录、存储和回放声学现象才发明的,最早能记录声音恐怕就是留声机了。当人类有了记录以及存储声音的能力之后,就迎来了模拟信号到数字信号的转换,所以如何记录以及存储声音会涉及到很多概念,理解这些概念往往对音视频开发比较重要。

物理声音

1、声波

声音是一种波,由物体的震动产生,声波的三要素是频率、振幅和波形,频率代表音阶的高低,振幅代表响度,波形代表音色。

2、频率

频率越高,波长就越短。低频声响的波长则较长,所以长波可以更容易地绕过障碍物,因此能量衰减就小,声音就会传得远,这点和电磁波一样。

3、响度

响度其实就是能量大小的反映,比如我们平时调节音量的大小就是在雕节响度。

4、音色

音色其实也不难理解,在同样的音调(频率)和响度(振幅)下,因为它们的音色不同,所以产生了不同的音色。本质是因为产生的波形不同。

5、人耳听力 人耳朵的听力频率范围大约是20Hz~20kHz,但是不同的频率,听力的感觉也会不一样:

人耳对3~4kHz频率范围内的声音比较敏感,而对于较低或较高频率的声音,敏感度就会有所减弱;在声压级较低时,听觉的频率特性会很不均匀;而在声压级较高时,听觉的频率特性 会变得较为均匀。频率范围较宽的音乐,其声压以80~90dB为最佳,超过90dB将会损害人耳(105dB为人耳极限)。

6、分贝

由此可以看出我们的耳朵对声音信号强弱刺激的反应不是线性的,而是呈对数比例关系,所以引入分贝的概念来表达声学量值,分贝的单位是dB。

数字音频

下面将介绍数字音频的一些概念,非常重要:

1、采样

对模拟信号进行采样,所谓采样就是在时间轴上对信号进行数字化。

2、采样率

人耳能够听到的频率范围是20Hz~20kHz,根据奈奎斯特定理(也称为采样定理),按比声音最高频率高2倍以上的频率对声音进行采样(也称为AD转换),所以采样频率一般为 44.1kHz,这样就可以保证采样声音达到20kHz也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。而所谓的44.1kHz就是代表1秒会采样44100次。

3、量化

量化是指在幅度轴上对信号进行数字化,比如用16比特(-32768,32767)的二进制信号来表示声音的一个采样,因此每单次采样的数据就有65536种取值:

4、编码

按照一定的格式记录采样和量化后的数字数据,比如顺序存储或压缩存储,等等。

5、音频裸数据格式

通常所说的音频的裸数据格式就是脉冲编码调制(Pulse Code Modulation,PCM)数据,这也就是声音信号转化为电信号之后最先被保存的一种格式。描述一段PCM数据一般需要以下几个概念:量化格式(又叫做位深度,sampleFormat)、采样率 (sampleRate)、声道数(channel)。

以CD的音质为例:量化格式为16比特(2字节),采样率为44100,声道数为2,这些信息就描述了CD的音质。

6、比特率

比特率就是1秒时间内的比特数目,它用于衡量音频数据单位时间内的容量大小。而对于CD音质的数据,比特率为 多少呢?16 * 44100 * 2 = 1411200bit = 172.26KB/s,一分钟内需要存储空间为172.26 * 60 / 1024 = 10.09MB。如果位深度更大,那么则意味着需要更大的存储空间。

音频编码

音频裸数据可以播放和存储,但是在网络传输的代价很大,所以必须对其进行压缩编码。

1、压缩比

压缩后的大小和原始数据大小的比值,通常小于1(否则就没有必要去做压缩, 因为压缩就是要减小数据容量)。

2、有损压缩与无损压缩

无损压缩是指解压后的数据可以完全复原。在常用的压缩格式中,用得较多的是有损压缩,有损压缩是指解压后的数据不能完全复原,会丢失 一部分信息,压缩比越小,丢失的信息就越多,信号还原后的失真就会越大。

3、压缩编码原理

压缩编码的原理实际上是压缩掉冗余信号,冗余信号包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等,被掩蔽掉的音频信号则主要是因为人耳的掩蔽效应,主要表现为频域掩蔽效应与时域掩蔽效应,无论是在时域还是频域上,被掩蔽掉的声音信号都被认为是冗余信息,不进行编码处理。

常用编码格式

1、WAV编码

PCM (脉冲编码调制) 是Pulse Code Modulation的缩写。而WAV编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在PCM数据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信息。

特点:音质非常好,大量软件都支持。适用多媒体开发的中间文件、保存音乐和音效素材。

2、MP3编码

MP3具有不错的压缩比,使用LAME编码(MP3编码格式的一种实现)的中高码率的MP3文件,听感上非常接近源WAV文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。

特点:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。适用高比特率下对兼容性有要求的音乐欣赏。

3、AAC编码

AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术 (比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE-AAC v2三种主要的编码格式。

特点:在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。适用于128Kbit/s以下的音频编码,多用于视频中音频轨的编码。

4、Ogg编码

Ogg是一种非常有潜力的编码,在各种码率下都有比较优秀的表现,而且完全免费,128Kbit/s的Ogg比192Kbit/s甚至更高码率的MP3还要出色。但是Ogg目前受支持的情况还不够好,软硬件支持都无法和MP3相提并论。

特点:可以用比MP3更小的码率实现比MP3更好的音质,高中低码 率下均有良好的表现,兼容性不够好,流媒体特性不支持,适合语音聊天的音频消息场景。

物理图像

1、RGB

实验证明,红绿蓝三种色光无法被分解,故称为三原色光,等量的三原色光相加会变为白光,即白光中含有等量的红光(R)、绿光(G)、蓝光(B)。

2、分辨率

假设一部手机屏幕的分辨率是1280×720,说明水平方向有720个像素点,垂直方向有1280个像素点,所以整个手机屏幕就有1280×720个像素点。

3、像素点组成

每个像素点都由三个子像素点组成,这些密密麻麻的子像素点在显微镜下可以看得一清二楚。当要显示某篇文字或者某幅图像时,就会把这幅图像的每一个像素点的RGB通道分别对应的屏幕位置上的子像素点绘制到屏幕上,从而显示整个图像。

图像数值表示

RGB表示方式

  • 浮点表示:取值范围为0.0~1.0,比如,在OpenGL ES中对每一个子像素点的表示使用的就是这种表达方式。
  • 整数表示:取值范围为0~255或者00~FF,8个比特表示一个子像素,32个比特表示一个像素,这就是类似于某些平台上表示图像格式的 RGBA_8888数据格式,RGB是三原色,A表示透明度。比如计算一张 1280×720的RGBA_8888图像的大小,32×1280×720/8/1024/1024 = 3.51MB。 再比如Android平台上RGB_565的表示方法为16 比特模式表示一个像素,R用5个比特来表示,G用6个比特来表示,B用5个比特来表示。

YUV表示方式

对于视频帧的裸数据表示,其实更多的是YUV数据格式的表示。YUV主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需要占用极少的频宽(RGB要求三个独立的视频信号同时传输)。

Y表示明亮度,也叫做灰阶值。U和V表示的则是色度,用来描述影像的色彩及饱和度,用于指定像素的颜色。YUV也可以称为YCbCr,虽然这些术语意味着略有不同,但它们往往会混淆并可互换使用。

Y表示亮度分量:如果只显示Y的话,图像看起来会是一张黑白照。

U(Cb)表示色度分量:是照片蓝色部分去掉亮度(Y)。

V(Cr)表示色度分量:是照片红色部分去掉亮度(Y)。

所以如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。

YUV采样格式

先说说扫描线的概念,电视萤幕由电子枪射出的电子,经由磁场偏向后打在屏幕上而发光,因此每一个图框都由电子枪的扫描线画出来。

还有个概念是宏像素,因为人体眼睛对亮度分量(Y)敏感,而对色度分量(U和V)不敏感,所以视频可以通过降低色度分量的采样数据,达到降低视频数据量而人眼很难分辨的目的。所以目前流行的YUV采样,基本都是降低色度分量的采集。当前格式下,至少需要x个像素点的采样数据,才能将这x个像素点完整表达,这几个像素点组成了一个宏像素,每个像素点称为宏像素点。所谓的完整表达,也就是让所有的Y分量都有对应的UV分量可以使用。

YUV4:4:4的采样方式表示:各采样分量在扫面每个像素点时,都不会降低采样率。

如图,一个方格表示一个像素点,方格中的YUV分别表示有在该像素点采YUV分量。之所以用四个方格显示,是因为YUV格式中,UV分量最小时需要四个像素共享一个UV分量对。同时,共享一个UV分量对的像素点,在平面上和UV分量都有临近的关系,所以这四个像素点不会是同一条扫面线上的点,而是分布在两条扫描线上。

所以,一个宏像素最多容纳四个宏像素点。而在YUV4:X:X的表示法中的4表达的也是这个意思。

从图可以看出,YUV4:4:4的采样方式,是对每个像素点进行Y、U、V分量的全采样。

最常用的表示形式是Y、U、V都使用8个字节来表示,对于四个像素,YUV4:4:4格式需要4×8+4×8+4×8=96位,因此,每个像素深度为24位。

YUV4:2:2的采样方式表示:水平方向Y分量与UV分量2:1采样,垂直方向不降低采样率。也就是这样

水平方向上的两个像素点组成了一个宏像素,两个像素点共享一对UV像素分量。

至于U和V分量是从水平方向第一个像素采集,还是分开到两个像素采集。如果是分开采集,是先采U分量还是先采集V分量,这个可能需要更专业的解释了。根据我搜索到的资料,最准确的说法只是,在扫描线上,水平方向上的UV分量是Y分量的一半。

对于四个像素,YUV4:2:2格式需要4×8 + 2×8 + 2×8 = 64位,每个像素深度为16位。

YUV4:2:2的采样方式表示:水平和垂直方向上Y分量和UV分量对的采样比都是2:1。

目前YUV4:2:0有两种变体,一种用于MPEG-1标准如下图:

另一个常用语MPEG-2标准,我们经常见到的4:2:0通常都是这种。如下图:

对于四个像素,YUV4:2:0格式需要4×8 + 8 + 8 = 48位,每个像素深度为12位。

YUV与RGB转化

凡是渲染到屏幕上的东西(文字、图片或者其他),都要转换为RGB的表示形式,那么YUV的表示形式和RGB的表示形式之间是如何进行转换的呢?对于标清电视601标准,它从YUV转换到RGB的公式与高清电视709的标准是不同的,通过如下的计算即可:

视频编码

音频压缩主要是去除冗余信息,从而实现数据量的压缩。那么对于视频压缩也是同理,也是通过去除冗余信息来进行压缩的。相较于音频数据,视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。

使用帧间编码技术可以去除时间上的冗余信息。

使用帧内编码技术可以去除空间上的冗余信息。MPEG算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样可以大大提高视频的压缩比。

相比较于ISO制定的MPEG,ITU-T制定的H.261、H.262、H.263、H.264一系列视频编码标准是一套单独的体系。其中, H.264集中了以往标准的所有优点,并吸取了以往标准的经验,采用的是简洁设计,现在使用最多的就是 H.264标准。

IPB帧

视频压缩中,每帧都代表着一幅静止的图像。而在进行实际压缩时,会采取各种算法以减少数据的容量,其中IPB帧就是最常见的一种。

I帧:帧内编码帧,可以当成静态图像。I帧可以看作一个图像经过压缩后的产物,I帧压缩可去掉视频的空间冗余信息,下面即将介绍的P帧和B帧是为了去掉时间冗余信息。

P帧:前向预测编码帧,通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也称为预测帧。

B帧:双向预测内插编码帧,既考虑源图像序列前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量的编码图像,也称为双向预测帧。

基于上面的定义,我们可以从解码的角度来理解IPB帧。I帧自身可以通过视频解压算法解压成一张单独的完整视频画面,所以I帧去掉的是视频帧在空间维度上的冗余信息。P帧需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面。B帧则需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面,所以P帧与B帧去掉的是视频帧在时间维度上的冗余信息。

PTS与DTS

DTS主要用于视频的解码,英文全称是Decoding Time Stamp,解码时间戳。PTS 主要用于在解码阶段进行视频的同步和输出,全称是Presentation Time Stamp,显示时间戳。

FFmpeg中使用AVPacket结构体来描述解码前或编码后的压缩数据,用AVFrame结构体来描述解码后或编码前的原始数据。对于视频来说,AVFrame就是视频的一帧图像,这帧图像什么时候显示给用户,就取决于它的PTS。

因为B帧需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面,所以一旦存在B帧,PTS与DTS势必就会不同,于是才会需要PTS和DTS这两种不同的时间戳。

GOP的概念

两个I帧之间形成的一组图片,就是GOP。通常在为编码器设置参数的时候,必须要设置gop_size的值,其代表的是两个I帧之间的帧数目。相对来讲,gop_size设置得越大,整个画面的质量就会越好。另外多使用B帧, 一般来说,I的压缩率是7(与JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来更多地保存I帧,这样就能在相同的码率下提供更好的画质。