紧接上一篇:
2.3 四种音频播放器的异同
ios中提供了多种音频文件的播放方法,常见的有基于AudioToolbox.framework框架的系统声音System Sound Services播放。基于AVFoundation.framework的AVAudioPlayer播放。利用音频队列Audio Queue Services以及利用第三方OpenAL播放音频文件。
由于AudioToolbox.framework与AVFoundation.framework的使用较为简单,这里将二者放在一起,从一个简单的demo讲解通过这两个音频框架播放音频的方法。而利用open al以及基于Audio Queue Services的音频播放器较为复杂,本书中专门拿出一小节来具体分析。
前文中已经提到利用AudioToolbox.framework可以播发一些系统声音,那为什么我们大多情况下播放器都不是采用此方法来设计的呢?原因很简单,因为它存在很多的限制。
首先它不能播放一些较大的音频文件,比如时间太长的音频文件它就无能为力。其次对于具有复杂压缩编码方式的音频文件也无法播放。同时对于一些高级的播放器的功能的实现,System Sound Services也存在很多缺陷。比如不能循环播放、无法实时控制音频播放的各种参数信息。这种方法设计的音频播放器对于一些提示音以及震动等效果比较合适。
在AVFoundation.framework框架中有一个非常重要的类AVAudioPlayer。在工程中引入此框架后就可以方便的使用这个框架中的各种类以及方法。利用AVAudioPlayer制作的播放器可以支持多种音频格式,如mp3、wav、aac等。同时利用AVAudioPlayer类可以很方便的实现各种高级的音频播放功能。例如音量控制、播放进度控制等。总之我们可以把AVFoundation.framework当作一个具有很多功能的高级播放工具的集合。
Openal提供了一组跨平台的音效处理API,开发人员可以方便的使用这项技术在linux、ios等各种平台下完成音频处理开发。提到open al当然不能不提到大名鼎鼎的open gl。Open al在api的构建上与open gl非常相似,学习过open gl的人可以很快的掌握open al的使用。Open al在3D音效处理方面具有明显的优势,尤其适合制作游戏中的3D音频效果。
以上三种音频特效都是对整段音频效果进行处理的,如果我们想实时的播放音频,对流媒体信息进行处理,那么以上三种方法都不适合了。这时我们需要采用另外一种音频处理技术,可以实现对音频数据的“分段处理”。Audio QueueServices利用一定数量的buffer,采用音频队列的形式,一段段加载音频数据。同时加载音频数据后及时的引用回调函数实现对音频信号的实时处理。
2.4 framework框架中常用类的介绍
前面已经介绍了制作音频播放器的4种基本方法,其中基于AudioToolbox.framework以及AVFoundation.framework是经常用到的两种音频播放方法。现在将在一个demo中介绍这两种用法。AudioToolbox.framework和AVFoundation.framework有很多类。我们不需要对每个都了解的十分清楚,但对于经常用到的核心类一定要十分熟悉。
在使用AudioToolbox.framework框架时,我们经常使用的数据类型与方法有:SystemSoundID、AudioServicesCreateSystemSoundID、AudioServicesPlaySystemSound、kSystemSoundID_Vibrate等。
typedef UInt32 SystemSoundID; 定义了一个开发人员想播放的系统音频文件的ID。对于音频文件的处理可以直接引用这个系统声音的ID号。AudioServicesCreateSystemSoundID 方法利用NSURL所定义的音频文件路径以及文件名创建SystemSoundID的内容。
AudioServicesPlaySystemSound根据系统文件的ID播放系统音频文件。但是利用此种方法播放的系统声音在格式、音频文件长度、扩展功能上都有限制。但对于制作一些提示声音是非常有用的。另外除了播放系统声音之外还可以制作震动效果。AudioServicesPlaySystemSound方法参数为SystemSoundID时可以播放系统声音,当参数类型修改为kSystemSoundID_Vibrate就可以实现震动效果。
在使用AVFoundation.framework框架时,需要使用的方法就更加的多。常用到的有以下方法:
audioPlayer play 开始播放音频文件
audioPlayer isPlaying 检测音频文件是否正在播放
audioPlayer stop 暂停播放音频文件
audioPlayer.volume 获取或者设置音频文件的音量大小
audioPlayer.numberOfLoops 获取音频文件的循环播放周期
audioPlayer.currentTime 获取或者设置音频文件的当前播放时间
audioPlayer.meteringEnabled 定时检测功能是否打开
audioPlayer updateMeters 实时更新音频文件参数
audioPlayer.numberOfChannels 获取音频文件的音频参数
audioPla