《音视频开发进阶指南》读书笔记(一) —— 音视频基础概念

3,359 阅读12分钟

前言

最近要学音视频,在图书馆借到这本《音视频开发进阶指南》,读了一段时间觉得挺好就在某宝买了。

以后一段时间应该都会沉浸在研究音视频中,开个专题记录哈每一章的读书笔记吧(以iOS开发的角度记录,安卓的暂时不涉及)。

第一章 音视频基础概念

本章介绍了 声音、图像、视频的相关概念。笔者在书本的基础上,研究了一些自己读书时好奇的问题,并且记录在这篇文章中。

声音的物理性质

声波的三要素:频率、振幅和波形。频率代表音阶的高低,振幅代表响度,波形代表音色。

频率越高,波长就越短。低频声响的波长则较长,所以其可以更容易地绕过障碍物,因此能量衰减就小,声音就会传得远。人的听力有一个频率范围,大约是20Hz~20kHz

响度是能量大小的反应。

波的形状决定了其所代表的音色。

数字音频

将模拟信号数字化,要经过3个步骤,采样,量化和编码。

采样

采样:在时间轴上对信号进行数字化。对应着声音的频率。

根据奈奎斯特定理,按比声音最高频率高2倍以上的频率对声音进行采样,经过数字化处理之后,人耳听到的声音质量不会被降低。所以采样频率一般为44.1kHz

量化

量化:在幅度轴上对信号进行数字化。对应着声音的振幅。

比如,每个采样用16比特的二进制信号来表示,则范围是[-32768, 32767]。


采样和量化,能勾画出波的形状,即音色。声波的三要素就转化完成了。


编码

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

  • 音频的裸数据格式,脉冲编码调制,英文叫PCM(Pulse Code Modulation)。

描述一段PCM数据一般需要以下几个概念:量化格式(sampleFormat)、采样率(sampleRate)、声道数(channel)。

量化格式和采样率上面提到过了,声道数是指支持能不同发声的音响的个数。不难理解,立体声道的声道数默认为2个声道。

  • 数据比特率,即1秒时间内的比特数目。

以CD的音质为例,量化格式(位深度)为16比特,采样率为44100,声道数为2。

比特率 44100 * 16 * 2 = 1378.123kbps

一分钟这类数据的存储空间 1378.125 * 60 / 8 / 1024 = 10.09MB


音频的压缩

压缩编码的原理实际上是压缩掉冗余信号,冗余信号是指不能被人耳感知到的信号,包含人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号等。人耳听觉范围之外的音频上面提到过。被掩蔽掉的音频信号则主要是因为人耳的掩蔽效应,主要表现为频域掩蔽效应与时域掩蔽效应。

书上没有介绍掩蔽效应,估计对于应用层的开发人员来说,不用理解也可以。但笔者还是查阅了一番,感叹一句,人类真奇妙。

这里引用了百度百科的资料,不感兴趣的可以直接略过。

频域掩蔽效应

一个强纯音会掩蔽在其附近同时发声的弱纯音,这种特性称为频域掩蔽,也称同时掩蔽(simultaneous masking)。如,一个声强为60dB、频率为1000Hz的纯音,另外还有一个1100Hz的纯音,前者比后者高18dB,在这种情况下我们的耳朵就只能听到那个1000Hz的强音。如果有一个1000Hz的纯音和一个声强比它低18dB的2000Hz的纯音,那么我们的耳朵将会同时听到这两个声音。要想让2000Hz的纯音也听不到,则需要把它降到比1000Hz的纯音低45dB。一般来说,弱纯音离强纯音越近就越容易被掩蔽;低频纯音可以有效地掩蔽高频纯音,但高频纯音对低频纯音的掩蔽作用则不明显。

由于声音频率与掩蔽曲线不是线性关系,为从感知上来统一度量声音频率,引入了“临界频带(criticalband)”的概念。通常认为,在20Hz到16kHz范围内有24个临界频带。

时域掩蔽效应

除了同时发出的声音之间有掩蔽现象之外,在时间上相邻的声音之间也有掩蔽现象,并且称为时域掩蔽。时域掩蔽又分为超前掩蔽(pre-masking)和滞后掩蔽(post-masking),如图12-05所示。产生时域掩蔽的主要原因是人的大脑处理信息需要花费一定的时间。一般来说,超前掩蔽很短,只有大约5~20ms,而滞后掩蔽可以持续50~200ms。这个区别也是很容易理解的。


下面介绍几种常用的压缩编码格式。简单看一下就行。

  1. WAV 编码

WAV 编码的一种实现就是在PCM 数据格式的前面加上44字节,分别用来描述PCM 的采样率、声道数、数据格式等信息。

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

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

  1. MP3 编码

MP3,使用LAME 编码的中高码率的MP3文件,听感上非常接近源WAV文件。

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

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

  1. AAC 编码

image.png

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

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

  1. Ogg 编码

特点:可以用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。

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


关于音频的概念,书上就介绍到以上。但笔者还有困惑,一段音频,播放器是怎么知道它的采样率、声道数、数据格式呢?


WAV文件的组成

于是笔者查阅到这篇文章WAV 文件格式。简单点说,就是头部的某一段,被定义下来代表的含义。所以编解码就按照约定的意义执行

至于其他编码格式,文件格式是怎么样的,就请读者有需要的时候再查阅了。


图像的物理现象

  • 红绿蓝三种光无法被分解,故称为三原色光。

假设一部手机屏幕的分辨率是 1280 * 720,说明有1280列,720行,所以整个手机屏幕就有1280 * 720 个像素点。每个像素点由三个子像素点组成。这三个像素点分别为红、绿、蓝,共同作用下形成一种颜色。

image.png

图像的数值表示

RGB 表示方式

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

  • 整数表示:取值范围为 0 ~ 255 或者 00 ~ FF,8个比特表示一个子像素,32个比特表示一个像素,这就是类似于某些平台上表示图像格式的 RGBA_8888 数据格式。比如, Android 平台上 RGB_565 的表示方法为16比特模式表示一个像素, R 用5个比特来表示, G 用 6个比特来表示, B 用5个比特来表示。

对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张 1280 * 720 的 RGBA_8888图像的大小,这也是位图(bitmap)在内存中所占用的大小。

1280 * 720 * 32 / 8 = 3.516MB

YUV表示方式

“Y”表示明亮度,也称灰阶值;而“U”和“V”表示的则是色度,它们的作用是描述影像的色彩及饱和度,用于指定像素的颜色。

“U”和“V”分别用Cr 和 Cb来表示。分别反映了 RGB 输入信号红色部分蓝色部分 与 RGB 信号亮度值之间的差异。

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

  • 最常用的表示形式是Y、U、V都使用一个字节来表示,所以取值范围就是 0 ~ 255。

  • YUV最常用的采样格式是 4:2:0。

这并不意味着只有Y、Cb,没有Cr分量。直接上图,方便理解。

以下说的取样针对UV分量。 4:4:4表示完全取样,每一个Y对应一组UV分量。 4:2:2表示2:1的水平取样,垂直完全采样,每两个Y共用一组UV分量。 4:2:0表示2:1的水平取样,垂直2:1采样,每四个Y共用一组UV分量。

image.png

image.png

举书本上一个例子,可以看到,色度的抽样率是4:1,即Y:U:V为4:1:1。32个像素点,就有32个Y,U和V一共16个,按1字节来算,占用48字节存储空间。

YUV 和 RGB 的转化

这一部分略,就是套用一个合理的转化公式转换。


书上关于图像就介绍到以上。笔者自己还查阅了图像的文件组成。

图像压缩编码格式及文件的组成

jpg是有损压缩格式,png是无损压缩格式。

有关它们的区别。

对于jpg文件格式,查到这篇jpg文件格式分析。和WAV 文件格式原理类似。

有趣的是,文件格式里有一段用于表述缩略图的数据。

在iOS开发中,相册显示图片时,可以先读取缩略图。具体显示时再加载原图数据。


视频的编码

采集到的视频源存在冗余信息,我们可以通过帧间编码技术以及帧内编码技术分别去除时间上和空间上的冗余信息。具体怎么做以及为什么可以这么做,具体请看这篇文章,书上没有介绍这部分。

经过一系列的去处冗余信息,可以大大的降低视频的数据量,更利于视频的保存、传输,去除冗余信息的过程,我们就称之为压缩编码。


压缩编码有很多标准,目前应用最广泛的是ITU-T 制定的H.264(AVC),以高压缩高质量和支持多种网络的流媒体传输著称。

原理:分组,组内每一帧之间可以通过互相参照,从而去掉冗余的信息。

先来了解有关的概念

  • IPB 帧

    • I 帧:帧内编码帧,I帧通常是每个GOP(暂且理解为一个组)的第一个帧。
    • P 帧:前向预测编码帧(predictive-frame),也称预测帧。
    • B 帧:双向预测内插编码帧,也称为双向预测帧。

一般来说 I的压缩率是7,P的压缩率是20,B可以达到50。

  • GOP

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

  • IDR帧

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

  • PTS 与 DTS

两种不同的时间戳。DTS(Decoding Time Stame)主要用于视频的解码,PTS(Presentation Time Stamp) 主要用于在解码阶段进行视频的同步和输出。


前面说到B帧,是前后预测帧。所以在解码时,会打乱解码和显示的顺序。所以存在B帧,PTS 和 DTS势必就会不同。


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

H.264 和 MPEG 只是编码算法,文件后缀名取决于你选取的封装容器。


书上第一章的内容介绍到以上就结束了。

视频压缩编码格式及文件的组成

跟音频和图像比起来,视频的文件组成复杂很多。



2019.5.17更新

回看这章,觉得有必要补充一点知识。

封装:运用编码算法处理后,再封装成某种类型的文件。例如PCM -> WAV,这种没用到编码算法,然后再文件数据头添加一些说明音频的信息,封装成.wav文件。

解封装:封装的时候,会有音视频的信息。解封装时,根据这份说明,把二进制数据识别出来。

编码:就是按照一定的格式记录采样和量化后的数字数据,比如顺序存储或压缩存储,等等。例如视频进行压缩编码,去除空间冗余信息。当然不可能每一帧都存满每一个像素点的数据,而是要利用说明信息,告诉是怎么编的。

解码:就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。上面编完码的视频,根据说明信息,生成每一帧的图像。

视音频同步:图像和声音的同步。视频和音频都有时间戳。有三种方法同步,第三章会提到。

协议/解协议:类比于计网协议。在网络上传输时,遵守哪个协议,接收端就作出相应的处理。协议除了音视频数据,还能有播放等指令。

所以接收到网络上的视频流,会有以下步骤。


参考