前言
在讲解音频渲染之前,需要对音频的基础知识有所了解,所以该篇分为基础概念和AudioTrack 以及 OpenSL ES Demo 实例讲解,这样有助于更好的理解 Android 中音频渲染。
音频的基础概念涉及的知识点比较多,该篇文章的上半部分会详细的介绍,后续文章基本上都会涉及音频的开发,有了基础对于后面的内容就更容易上手了。
音频的基础知识
声音的物理性质
- 声音是波
说到声音我相信只要听力正常的人都听见过声音,那么声音是如何产生的呢?记得初中物理课本上的描述 - 声音是由物体的振动而产生的。其实声音是一种压力波,当敲打某个物体或演奏某个乐器时,它们的振动都会引起空气有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波,由此就产生了声波,这种现象会一直延续到振动消失为止。
- 声波的三要素
声波的三要素是频率、振幅、和波形,频率代表音阶的高低,振幅代表响度,波形代表音色。
声音的传播介质
声音的传播介质很广,它可以通过空气、液体和固体进行传播;而且介质不同,传播的速度也不同,比如声音在空气中的传播速度为 340m/s , 在蒸馏水中的传播速度为 1497 m/s , 而在铁棒中的传播速度则可以高达 5200 m/s ;不过,声音在真空中时无法传播的。
- 回声
当我们在高山或者空旷地带高声大喊的时候,经常会听到回声,之所以会有回声是因为声音在传播过程中遇到障碍物会反弹回来,再次被我们听到。
但是,若两种声音传到我们的耳朵里的时差小于 80 毫秒,我们就无法区分开这两种声音了,其实在日常生活中,人耳也在收集回声,只不过由于嘈杂的外接环境以及回声的分贝比较低,所以我们的耳朵分辨不出这样的声音,或者说是大脑能接收到但分辨不出。
- 共鸣
自然界中有光能,水能,生活中有机械能,电能,其实声音也可以产生能量,例如两个频率相同的物体,敲打其中一个物体时另一个物体也会振动发生。这种现象称为共鸣,共鸣证明了声音传播可以带动另一个物体振动,也就是说,声音的传播过程也是一种能量的传播过程。
- 数字音频
上一小节我们主要介绍了声音的物理现象以及声音中常见的概念,也会后续的讲解统一了术语,本节主要介绍数字音频概念。
为了将模拟信号数字化,本节将分为 3 个概念对数字音频进行讲解,分别是采样、量化和编码。首先要对模拟信号进行采样,所谓采样就是在时间轴上对信号进行数字化。根据奈奎斯特定理(也称采样定理),按比声音最高频率高 2 倍以上的频率对声音进行采样,对于高质量的音频信号,其频率范围在 20Hz ~ 20kHz ,所以采样频率一般为 44.1kHz ,这样就保证采样声音达到 20kHz 也能被数字化,从而使得经过数字化处理之后,人耳听到的声音质量不会被降低。而所谓的 44.1 kHz 就是代表 1 s 会采样 44100 次。
那么,具体的每个采样又该如何表示呢?这就涉及到将要讲解的第二个概念: 量化。量化是指在幅度轴上对信号进行数字化,比如用 16 bit 的二进制信号来表示声音的一个采样,而 16 bit 所表示的范围是 [-32768 , 32767] , 共有 65536 个可能取值,因此最终模拟的音频信号在幅度上也分为了 65536 层。
既然每一个分量都是一个采样,那么这么多的采样该如何进行存储呢?这就涉及将要讲解的第三个概念: 编码。所谓编码,就是按照一定的格式记录采样和量化后的数字数据,比如顺序存储或压缩存储等等。
这里涉及了很多中格式,通常所说的音频的裸数据就是 PCM (Pulse Code Modulation) 数据。描述一段 PCM 数据一般需要以下几个概念:量化格式(sampleFormat)、采样率(sampleRate)、声道数 (channel) 。以 CD 的音质为例:量化格式为 16 bit (2 byte),采样率 44100 ,声道数为 2 ,这些信息就描述了 CD 的音质。而对于声音的格式,还有一个概念用来描述它的大小,称为数据比特率,即 1s 时间内的比特数目,它用于衡量音频数据单位时间内的容量大小。而对于 CD 音质的数据,比特率为多少呢? 计算如下:
44100 * 16 * 2 = 1378.125 kbps
那么在一分钟里,这类 CD 音质的数据需要占据多大的存储空间呢?计算如下:
1378.125 * 60 / 8 / 1024 = 10.09 MB
当然,如果 sampleFormat 更加精确 (比如用 4 个字节来描述一个采样),或者 sampleRate 更加密集 (比如 48kHz 的采样率), 那么所占的存储空间就会更大,同时能够描述的声音细节就会越精确。存储的这段二进制数据即表示将模拟信号转为数字信号了,以后就可以对这段二进制数据进行存储,播放,复制,或者进行其它操作。
音频编码
上面提到了 CD 音质的数据采样格式,曾计算出每分钟需要的存储空间约为 10.09 MB ,如果仅仅是将其存储在光盘或者硬盘中,可能是可以接受的,但是若要在网络中实时在线传输的话,那么这个数据量可能就太大了,所以必须对其进行压缩编码。压缩编码的基本指标之一就是压缩比,压缩比通常小于 1 。压缩算法包括有损压缩和无损压缩。无所压缩是指解压后的数据可以完全复原。在常用的压缩格式中,用的较多的是有损压缩,有损压缩是指解压后的数据不能完全恢复,会丢失一部分信息,压缩比越小,丢失的信息就比越多,信号还原后的失真就会越大。根据不同的应用场景 (包括存储设备、传输网络环境、播放设备等),可以选用不同的压缩编码算法,如 PCM 、WAV、AAC 、MP3 、Ogg 等。
- WAV 编码
WAV 编码就是在 PCM 数据格式的前面加了 44 个字节,分别用来存储 PCM 的采样率、声道数、数据格式等信息。
特点: 音质好,大量软件支持。
场景: 多媒体开发的中间文件、保存音乐和音效素材。
- MP3 编码
MP3 具有不错