音视频开发 - 音视频基础概念

1、数字音频为什么需要编码?

通常所说的音频的裸数据格式就是脉冲编码调制 - PCM数据。

描述一段PCM数据一般分为采样、量化、编码。对模拟信号进行采样,所谓采样就是

在时间轴上对信号进行数字化。由于人耳能听到的频率范围是20Hz~20kHz,所以采

样频率一般为44.1kHz,这样就能保证质量。

量化:对幅度轴上的信号数字化,比如用16比特的二进制信号表示一个采样,那么

幅度就分为65536层。

编码:对量化后的数据进行存储或者压缩存储。

如果不压缩对于量化16比特量化音质的数据,比特率为多少呢?

计算如下:44100 * 16 * 2 = 1378.125kbps

那么在1分钟里,这类16比特量化音质的数据需要占据多大的存储空间呢?计算如下:

1378.125 * 60 / 8 / 1024 = 10.09MB其实也是很大的,所以需要对音频数据进行压缩

2、音频压缩

下面介绍几种常用的压缩编码格式。

(1)WAV编码

WAV编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在PCM数

据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信

息。

特点:音质非常好,大量软件都支持。

适用场合:多媒体开发的中间文件、保存音乐和音效素材

(2)MP3编码

MP3具有不错的压缩比,使用LAME编码(MP3编码格式的一种实现)的中高码

率的MP3文件,听感上非常接近源WAV文件,当然在不同的应用场景下,应该调整

合适的参数以达到最好的效果。

特点:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。

适用场合:高比特率下对兼容性有要求的音乐欣赏。

3)AAC编码

AAC是新一代的音频有损压缩技术。

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

适用场合:128Kbit/s以下的音频编码,多用于视频中音频轨的编码

(4)Ogg编码

Ogg是一种非常有潜力的编码,在各种码率下都有比较优秀的表现,尤其是在中低

码率场景下。Ogg目前受支持的情况还不够好,无论是软件上的还是硬件上的支

持,都无法和MP3相提并论。

特点:可以用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的

表现,兼容性不够好,流媒体特性不支持。

适用场合:语音聊天的音频消息场景。

3、图像成像原理

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

1280个像素点,所以整个手机屏幕就有1280×720个像素点(这也是分辨率的含

义)。每个像素点都由三个子像素点组成(如图1-1所示)。当要显示某篇文字或者

某幅图像时,就会把这幅图像的每一个像素点的RGB通道分别对应的屏幕位置上的

子像素点绘制到屏幕上,从而显示整个图像。

音视频开发 - 音视频基础概念_第1张图片
1-1

RGB

像素里面的子像素常用的表示方式有以下几种。

浮点表示:取值范围为0.0~1.0,比如,在OpenGL ES中对每一个子像素点的表示使用的就是这种表达方式。

整数表示:取值范围为0~255或者00~FF,8个比特表示一个子像素,32个比特表

示一个像素,这就是类似于某些平台上表示图像格式的RGBA_8888数据格式。

对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张1280×720的

RGBA_8888图像的大小,可采用如下方式:

1280 * 720 * 4 = 3.516MB

这也是位图(bitmap)在内存中所占用的大小,所以每一张图像的裸数据都是很大的。

YUV

视频帧的裸数据表示,其实更多的是YUV数据格式的表示。

YUV主要应用于优化彩色视频信号的传输,使其向后兼容老式黑白电视。与RGB视

频信号传输相比,它最大的优点在于只需要占用极少的频宽(RGB要求三个独立的

视频信号同时传输)。

其中“Y”表示明亮度(Luminance或Luma),也称灰阶值;

而“U”和“V”表示的则是色度(Chrominance或Chroma),它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色。

“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一

起。“色度”则定义了颜色的两个方面——色调与饱和度,分别用Cr和Cb来表示。其

中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,而Cb反映的则

是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。

之所以采用YUV色彩空间,是因为它的亮度信号Y和色度信号U、V是分离的。如果

只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电

视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使

黑白电视机也能接收彩色电视信号,最常用的表示形式是Y、U、V都使用8个字节来

表示,所以取值范围就是0~255。

YUV最常用的采样格式是4:2:0,4:2:0并不意味着只有Y、Cb而没有Cr分量。

它指的是对每行扫描线来说,只有一种色度分量是以2:1的抽样率来存储的。如图

音视频开发 - 音视频基础概念_第2张图片
1-2

相较于RGB,我们可以计算一帧为1280×720的视频帧,用YUV420P的格式来表

示,其数据量的大小如下:

1280 * 720 * 1 + 1280 * 720 * 0.5 = 1.318MB

如果fps(1秒的视频帧数目)是24,按照一般电影的长度90分钟来计算,那么这部

电影用YUV420P的数据格式来表示的话,其数据量的大小就是:

1.318MB * 24fps * 90min * 60s = 166.8GB

其实是相当大的,所以需要编码。

4、YUV和RGB的转化

音视频开发 - 音视频基础概念_第3张图片
1-3

5、视频编码

视频数据有极强的相关性,也就是说有大量的冗余信息,包括空间上的冗余信息和时间上的冗余信息。

ISO制定了标准:Motion JPEG即MPEG,MPEG算法是适用于动态视频的压缩算

法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样

可以大大提高视频的压缩比。截至目前,MPEG的版本一直在不断更新中,主要包

括这样几个版本:Mpeg1(用于VCD)、Mpeg2(用于DVD)、Mpeg4 AVC(现在

流媒体使用最多的就是它了)。

ITU-T制定的H.261、H.262、H.263、H.264一系列视频编码标准是一套单独的体

系。其中,H.264集中了以往标准的所有优点,并吸取了以往标准的经验,采用的是

简洁设计,这使得它比Mpeg4更容易推广。现在使用最多的就是H.264标准,H.264

创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细

的分像素运动矢量(1/4、1/8)和新一代的环路滤波器,这使得压缩性能得到大大提

高,系统也变得更加完善。

5.1、IPB帧

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

I帧:帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所使用的一种视频压缩技术)

的第一个帧,经过适度地压缩,作为随机访问的参考点,可以当成静态图像。I帧可以看作一

个图像经过压缩后的产物,I帧压缩可以得到6:1的压缩比而不会产生任何可觉察的模糊现

象。I帧压缩可去掉视频的空间冗余信息,下面即将介绍的P帧和B帧是为了去掉时间冗余信

息。

P帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息

充分去除来压缩传输数据量的编码图像,也称为预测帧。

B帧:双向预测内插编码帧(bi-directional interpolated predictionframe),既考虑源图像序列

前面的已编码帧,又顾及源图像序列后面的已编码帧之间的时间冗余信息,来压缩传输数据量

的编码图像,也称为双向预测帧。

基于上面的定义,我们可以从解码的角度来理解IPB帧。

I帧自身可以通过视频解压算法解压成一张单独的完整视频画面,所以I帧去掉的是视频帧在空间维度上的冗余信息。

P帧需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面。

B帧则需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一张完整的视频画面,所以P帧与B帧去掉的是视频帧在时间维度上的冗余信息。

IDR帧

在H264的概念中有一个帧称为IDR帧,那么IDR帧与I帧的区别是什么呢?因为H264采用了

多帧预测,所以I帧之后的P帧有可能会参考I帧之前的帧,这就使得在随机访问的时候不能以找

到I帧作为参考条件,因为即使找到I帧,I帧之后的帧还是有可能解析不出来,而IDR帧就是一

种特殊的I帧,即这一帧之后的所有参考帧只会参考到这个IDR帧,而不会再参考前面的帧。在

解码器中,一旦收到一个IDR帧,就会立即清理参考帧缓冲区,并将IDR帧作为被参考的帧。

5.2、PTS与DTS

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

在没有B帧的情况下,DTS和PTS的输出顺序是一样的。因为B帧打乱了解码和显示的顺序,

所以一旦存在B帧,PTS与DTS势必就会不同,FFmpeg中使用AVPacket结构体来描述解码前

或编码后的压缩数据,用AVFrame结构体来描述解码后或编码前的原始数据。对于视频来说,

AVFrame就是视频的一帧图像,这帧图像什么时候显示给用户,取决于它的PTS。DTS是

AVPacket里的一个成员,表示该压缩包应该在什么时候被解码,如果视频里各帧的编码是按

输入顺序(显示顺序)依次进行的,那么解码和显示时间应该是一致的,但是事实上,在大多

数编解码标准(如H.264或HEVC)中,编码顺序和输入顺序并不一致,于是才会需要PTS和

DTS这两种不同的时间戳

5.3、GOP的概念

两个I帧之间形成的一组图片,就是GOP(Group Of Picture)的概念。

通常在为编码器设置参数的时候,必须要设置gop_size的值,其代表的是两个I帧之间的帧数

目。gop_size设置得越大,整个画面的质量就会越好,但是在解码端必须从接收到的第一个I

帧开始才可以正确解码出原始图像,否则会无法正确解码(这也是前面提到的I帧可以作为随

机访问的帧)。在提高视频质量的技巧中,还有个技巧是多使用B帧,一般来说,I的压缩率是

7(与JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间

可以用来更多地保存I帧,这样就能在相同的码率下提供更好的画质。所以我们要根据不同的

业务场景,适当地设置gop_size的大小,以得到更高质量的视频。

结合IPB帧和图1-4,理解PTS与DTS的概念。

音视频开发 - 音视频基础概念_第4张图片
1-4

你可能感兴趣的:(音视频开发 - 音视频基础概念)