多媒体分析 - Audio篇(一)
个人笔记,欢迎转载,请注明出处
代码分析版本:Android6.0
水平有限,如果出现错误或者狭隘的理解欢迎善意的批判
1. 前言
多媒体是操作系统的一个重要部分,本篇主要分析音频/Audio的内容。要说Audio的重要性,就算失去了它系统依然能运行,地球照样转,但背后的代价是系统失去了与我们交互的方式,犹如生活在一个寂静的世界中。
生活中往往越是常见的越是容易忽略它的美。对于声音我一直充满着好奇心。它是能量通过振动产生的波,波在介质中传播到我们的耳朵,其中螺旋状耳蜗开始端的毛细胞负责采集高频率声音,中部采集中等频率的声音,耳蜗螺旋尾部采集低频率声音。毛细胞将声音的信息送至脊神经,脊神经与脑干的多个区域相连。在脑干中,声音的节律和强度信息得到加工处理,然后听觉信息被传送到中脑下丘做进一步分析,下丘又与有过滤信息功能的丘脑相连。最终,听觉信息进入颞叶上、后部的初级听觉皮层。emm...没错,好像跑题了T_T
回到正题,本文主要是分析Audio在Android系统中的框架,根据一些具体问题来分析框架设计的意义。毕竟网上相关的资料太多了,所以我想基于自己的理解站在系统的角度上学习一边。当然在理解过程中难免出现偏差,也期待你善意的批判。
2. 基础知识
注:部门图片来源于网络
首先我们要明白一点,无论系统框架如何设计,最终声音是要通过振动在介质中传播到我们耳朵中的。这里简单介绍一下声音输出设备的基本原理。在图1中,B是一个磁铁magnet,C是一个线圈voice coil,A是一个可以振动的隔膜diaphragm。我们学过电磁理论,当C中电流产生变化的时候产生变动的磁场,变动的磁场让B和C之间产生力的作用从而带动A隔膜一起振动。
图1. 图2.
当A隔膜振动时候产生一定频率的波,这也就是我们听到的声音。简单来说让C线圈中电流按照特定的规律变化,就能使A隔膜按照对应的规律振动从而产生我们想要的声音(当然,这个过程说的简单但是要做好还是需要很高的技术)。
现在我们把关系最简化,例如要产生下图中的一种声波,我们就需要输入对应的信号源(变化的电流)。
![](https://i-blog.csdnimg.cn/blog_migrate/8b0347ce13ce46c6d273624ce0fbe3f0.gif)
上面看到信号是模拟信号,也就是在时间上是连续的。但是在计算机中信息都是用'0' '1'来存储的数字信号,是离散的信息。将连续的模拟信号存储到计算机中就涉及到了采样过程。
2.1 采样率
下面我就已如何将模拟信号存储在计算机中为例普及一些基础知识点。例如下图中按照一固定的频率采集波形的数值,这里就涉及一个“采样频率”的概念,也就是说单位时间内采集多少个数值。
![](https://i-blog.csdnimg.cn/blog_migrate/95fa58e4dd95255fc51bb74d9928c1ef.png)
针对同一个信号源,如果采用不同的采样率会有什么效果呢?在图5中可以看到,采样率越高则采集到的数值点也越多。相反的,采样率低则采集到的数值点也越少。那么采样率有什么影响?
![](https://i-blog.csdnimg.cn/blog_migrate/a9c323032590d6266c291337d0c0b99b.png)
要清楚我们的目的是为了保存模拟信号的信息。例如图6中,由于采样频率较低,采集到的点也比较少。当把采集点连接起来的形状(红色线)和原始信号的图形(灰色线)进行比价,可以发现有几处地方明显和原始信号有差异,这样就产生了"失真"也就是说无法还原真实的信号信息。所以采样率是不能太低的,具体的理论知识请参考“香浓采样定理/奈奎斯特采样定理"。简单的意思就是采样率越高越能反应真实的信息,但是采样率越高需要存储的采样点也就越多,那么对存储的需求也就越大。
![](https://i-blog.csdnimg.cn/blog_migrate/39ba88e1ee44d1d8377ab18362906158.png)
2.2 采样位数/位深
采样率不是唯一的要素。例如图7中,对于同一个Audio信号进行采样,相同的采样率说明单位时间内采集到的数值点是一样的,但是采样数值一个是用16bit存储另一个是用24bit存储,当然是24bit存储的更加精确。举一个不恰当的例子:每秒钟给你100张钞票,情况A 钞票面值50 情况B 面值100。虽然都是100张钞票但是哪种让你觉得开心呢? 答案:当然是不管A还是B我都很开心啊,就算撒1块钱我也很开心...
![](https://i-blog.csdnimg.cn/blog_migrate/857babea1e6f59defe844f788336ab54.png)
总结一下,采样率越高越能反应真实的信号,采样位数越大越能精确的记录信号的数值。虽然两者都是越大约好,但是对于存储空间的需求也会随之增加。可以从图8 中直观的感受一下不同频率、位深的效果。
![](https://i-blog.csdnimg.cn/blog_migrate/d3d91bb381b974e406ad786f30481b4c.jpeg)
3. Audio框架
分析Audio框架,就从最常用的情况下手,例如播放歌曲。通过前面的分析,要能产生声音那么最基本的过程是不能省略的。也就是说从数字信号转变成模拟信号的过程是必须要走的。
3.1 数字信号源
在我们听歌的时候,经常碰到一个问题就是选择不同的文件格式,例如“无损音乐”的flac 格式 或者常见的mp3格式。这些歌曲文件就是我们需要的数字信号源(在计算机中以0101二进制存储)。虽然文件格式很多,但是他们目的都是为了压缩数据,压缩算法上有所不同。为什么要压缩数据呢?? 前面我们提到过,如果想越真实越精确的保存信号那么必然会提高对存储的需求。例如原始数据大小是30MB,经过一定格式的压缩存储变成了8MB,不仅减少了占用的空间而且传输也比较方便。
3.2 数据流向分析
下面的Audio框架图显示了数据源经过的每一个处理流程,从压缩的文件到解压缩过程,再到PCM数据的流向,最终在底层硬件发出声音。每一个过程都可以挖的很深。在后续的博客中,将针对每个流程进行分析。希望能在分析的过程中不仅仅是读代码,更重要的是能学这样设计的优点。
![](https://i-blog.csdnimg.cn/blog_migrate/8c235da402cb8cdabd3b73239db4711e.jpeg)
每个流程的具体分析将在后续的博客中更新....