转载

Core Audio

在音乐制作方面,苹果的系统公认是最好的,我们经常在各种片里看到拿个Mac的本本在那里进行音乐的处理,还有各种DJ,打碟的时候旁边也摆个Mac的本本。咱们大家应该都不是搞音乐的,所以苹果的系统比别人的好在哪里,我们也说不清,但我们能知道的是,苹果在声音以及音乐处理方面,底层的实现都是Core Audio,包括iOS。Core Audio是C的,所以能直接在ObjectiveC和C++中直接使用。另外那些可以调用C库的语言也能使用,比如Java,Ruby,Python这些。

Core Audio由于是基于C语言的,所以在调用它的API时,方式和我们平常iOS开发的OC,Swift不同,是典型的过程性语法。

Core Audio作为苹果的音乐处理引擎,主要分为以下几个大的组成部份:

1. Audio Units:这部分的API会直接处理音乐或声音数据,它会使用各种各样的buffer,比如从录音设备中获取的数据,经过处理后,讲结果丢给另一个audio unit。处理的方式是使用各种回调函数,用户的具体操作就在这个回调中实现。

2. Audio Queues:这部分算是在Audio Units之上的一层应用,这将是用户能够方便的实现录制,播放等功能,而不必自己去处理一些线程,IO,播放时序这些恼人的事情。

3. OpenAL:这算是定义了一个声音方面的工业标准,他能让用户实现声音的3D效果,比如环绕立体声这些。这部分也是在audio unit之上的一层应用,在游戏中会用到很多这方面的东东。

上面是Core Audio的数据处理引擎,在声音数据读取方面,Core Audio也提供了很多helper API,它也能分为几个大类

1. Audio File Services:看名字就能知道,它包含了基于本地文件的声音读取操作。其实在声音处理方面,有各种各样很多不同的音频格式,比如我们常见的mp3,wav,aiff这些,Audio File Services都能帮你处理,同时也能帮用户节省了很大的时间和精力。

2. Audio File Stream Services:这主要是用在网络环境下的,比如我们会听很多在线播放,网络广播这些,实际的音频数据都是以流(stream)的方式提供给用户的,这里就是用来处理这些的。

3. Audio Converter Services:在音频处理中,我们经常需要进行格式转换,比如在mp3和wav格式之间进行互转,这些操作都要用到它。

4. Extended Audio File Services:这部分的东西算是1和3的升级版,也就是能让你在通过文件方式读写音频数据的同时,实现音频格式的转换。

5. Core MIDI:音频录制时,出去我们常用的通过麦克风,其实很多也是来自于MIDI设备,比如MIDI钢琴,MIDI吉他等等,据说这是Mac才独有的功能,也许这就是很多音乐人钟情于Mac系统的原因吧。

6. Audio Session Services:这个是专门针对iOS的,主要用来处理iOS中音频资源的使用,它通过使用各种iOS中定义好的category,来实现用户的某些特定操作。比如当屏幕锁频时,你的App的声音是否继续播放;当你打开一个App时,突然有个电话拨进来,你的声音该如何处理等等。

下面我们来说一说计算机是如何处理音频信息的。

我们都知道,声音在空气中传播是,是一段连续的震荡波,已x,y坐标系来表示的话,x轴相当于时间,y轴就是某个时间点时音波相对于振幅最大值的比例。对计算机来说,要表这种曲线,我们可以通过在这段曲线的各个点进行数据采集,这种方法在计算机领域称之为pulse code modulation(脉冲编码调制),一般来说,都是按照x轴,也就是根据时间来对音频信息进行采集,如果是按照等分时间的方式,通常叫做linear pulse code modulation(LPCM),这个术语在音频处理中我们会经常碰到,所以在这里说明一下。这里的音频信息采集也有一个特定的术语,叫做采样(sampling)。

对于我们常见的CD音质的音频信息采样来说,使用的采样率是44.1KHz,也就是说,每秒钟会进行44100次的音频信息采样。也就是说,对于CD音质的音频信息,每23微秒就进行一次采样。在这23微秒的间隙,相应的音频信息则会丢失。为什么采用44.1KHz的采样率,是因为根据香农采样定律,如果你要采集一段震荡波的信息,这段波的最大频率是B Hz,那么你使用的采样率要达到1/(2B),也就是1/(2B)秒就采样一次,才会尽可能的保持这段波的准确性。对于我们人耳来说,可以听到的频率范围是在20~20KHz之间,所以才用44.1KHz的采样率相对于人耳的听觉范围是比较合适的。

另外再说一下在Core Audio中经常会用的几个术语,sample,frame,channel和packet。

一个sample就是一个采样点的信息,对于x,y坐标来说,就是一个(x,y)的值。

channel就是声道的意思,一个channel在一个时间点上只有一个sample信息,如果包含多个声道,将有多个channel。在音频数据处理中,把某个时间点上的所有channel打包到一起,称之为一个frame,因为在播放时,多声道的音频数据需要同时进行处理,这样的大包能够让这些处理变得更容易。

再往上就是packet的概念,一个packet是把多个frame进行打包。

所以从大到小来说,分别是packet,frame,channel,sample。这些基本概念构成了整个计算机音频处理的基础,包含各个音频数据单元,音频格式信息等。

不过LPCM格式的音频没有用到packet,因为他是一种非压缩的音频数据,但对于一些音频压缩格式来说,会用到packet。

采样率对于所有的音频格式来说,并不一定是不变的。PCM的格式会使用恒定的采样率(constant bit rate, CBR),也就是说如果采样率为44.1KHz,那么这个采样率将一只是这个值。当然也会有变换的采样率(variable bit rate, VBR),通常在遇到VBR的情况是,Core Audio的API会处理VBR的格式,处理的方式一般来说为,给你一段数据,然后额外提供一个包含packet description的数组,告诉你这一段数据中每一个packet的数据情况,然后进行数据的处理。所以对于CBR的情况来说,是没有这些的。

原文  https://shellcodes.sinaapp.com/articles/566
正文到此结束
Loading...