iPhone OS 主要提供如下了几种播放音频的方法:html
1. System Sound Services网络
System Sound Services 是最底层也是最简单的声音播放服务,调用 AudioServicesPlaySystemSound 这个方法就能够播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或者警告音,由于它有不少限制:app
■ 声音长度要小于 30 秒
■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
■ 打包成 .caf, .aif, 或者 .wav 的文件
■ 不能控制播放的进度
■ 调用方法后当即播放声音
■ 没有循环播放和立体声控制less
另外,它还能够调用系统的震动功能,方法也很简单。具体的代码能够参考官方的示例 SysSound
,可是官方的示例只有一些简单的用法,从文档中咱们发现能够经过 AudioServicesAddSystemSoundCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数咱们能够解决很多问题,好比能够克服 System Sound Services 自己不支持循环播放的问题。iphone
2. AVAudioPlayer 类
AVAudioPlayer 是 AVFoundation.framework 中定义的一个类,因此使用要先在工程中引入 AVFoundation.framework。咱们能够把 AVAudioPlayer 看做是一个高级的播放器,它支持普遍的音频格式,主要是如下这些格式:ide
■ AAC
■ AMR(AdaptiveMulti-Rate, aformatforspeech)
■ ALAC(AppleLossless)
■ iLBC(internetLowBitrateCodec, anotherformatforspeech)
■ IMA4(IMA/ADPCM)
■ linearPCM(uncompressed)
■ µ-lawanda-law
■ MP3(MPEG-1audiolayer3函数
AVAudioPlayer 能够播听任意长度的音频文件、支持循环播放、能够同步播放多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等,更高级的功能能够参考 AVAudioPlayer 的文档 。要使用 AVAudioPlayer 的对象播放文件,你只需为其指定一个音频文件并设定一个实现了 AVAudioPlayerDelegate 协议的 delegate 对象。oop
只要将 AVAudioPlayer 的 numberOfLoops 属性设为负数,音频文件就会一直循环播放直到调用 stop 方法。优化
AVAudioPlayer 一样支持 Callback,这是 AVAudioPlayerDelegate 的一个可选 delegate 方法:ui
- (void ) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL ) flag { if (player == self .player && flag == YES) { NSLog(@"Playback finish." ); } }
另外,你能够随时控制 AVAudioPlayer 对象的播放、暂停以及中止,经过判断对象的状态,分别调用 play、pause 和 stop 方法便可:
- (IBAction) playOrPause: (id ) sender { // if playing, pause if (self .player.playing) { [self .player pause]; // if stopped or paused, start playing } else { [self .player play]; }
虽然 AVAudioPlayer 能够播放不少格式,可是咱们在实际开发过程当中仍是最好使用一些没有压缩的格式,好比 WAVE 文件,这样能够减小系统处理单元的资源占用,以便更好的完成程序的其余功能。另外,在使用 AVAudioPlayer 连续播放 mp3 这类通过压缩的音频文件时,在链接处可能出现必定的间隔时间。
3. Audio Queue Services
若是以上两种音频播放的解决方案都没法知足你的需求,那么我想你确定须要使用 Audio Queue Services。使用 Audio Queue Services 对音频进行播放,你能够彻底实现对声音的控制。例如,你能够在声音数据从文件读到内存缓冲区后对声音进行必定处理再进行播放,从而实现对音频的快速/慢速 播放的功能。
由于 Audio Queue Services 相对复杂不少,Apple 官方已经把它整理为一本书了,具体能够参考 Audio Queue Services Programming Guide 和 SpeakHere 的程序示例。
4. OpenAL
OpenAL 是一套跨平台的开源的音频处理接口,与图形处理的 OpenGL 相似,它为音频播放提供了一套更加优化的方案。它最适合开发游戏的音效,用法也与其余平台下相同。
本篇主要讲AVAudioPlayer,
AVAudioPlayer类封装了播放单个声音的能力。播放器能够用NSURL或者NSData来初始化,要注意的是NSURL不能够是网络url而必须是本地文件url,由于AVAudioPlayer不具有播放网络音频的能力。
一个AVAudioPlayer只能播放一个音频,若是你想混音你能够建立多个AVAudioPlayer实例,每一个至关于混音板上的一个轨道。
1、建立一个播放器
AVAudioPlayer *player = [[AVAudioPlayeralloc] initWithContentsOfURL:[NSURLfileURLWithPath:[[NSBundlemainBundle] pathForResource:@"星月神话" ofType:@"mp3"]] error:nil];//使用本地URL建立 AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:Data error:nil];//使用NSData建立
2、播放器属性
建立一个AVAudioPlayer之后你就能够对它的各类属性进行访问或设置了。
一、音量
player.volume =0.8;//0.0-1.0之间
二、循环次数player.numberOfLoops =3;//默认只播放一次
三、播放位置player.currentTime =15.0;//能够指定从任意位置开始播放
四、声道数
NSUInteger channels = player.numberOfChannels;//只读属性
五、持续时间
NSTimeInterval duration = player.duration;//获取持续时间
六、仪表计数
player.meteringEnabled =YES;//开启仪表计数功能
[playerupdateMeters];//更新仪表计数
3、播放声音[player prepareToPlay];//分配播放所需的资源,并将其加入内部播放队列
[playerplay];//播放
[playerstop];//中止
4、代理方法
这个类对应的AVAudioPlayerDelegater的委托方法。 audioPlayerDidFinishPlaying:successfully: 当音频播放完成以后触发。当播放完成以后,能够将播放按钮的文本从新回设置成:Play Audio File
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { //播放结束时执行的动做 [audioButton setTitle:@"Play Audio File" forState:UIControlStateNormal]; }
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error; { //解码错误执行的动做 }
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player; { //处理中断的代码 } audioPlayerEndInterruption:,当程序被应用外部打断以后,从新回到应用程序的时候触发。在这里当回到此应用程序的时候,继续播放音乐。 - (void)audioPlayerEndInterruption:(AVAudioPlayer *)player { [audioPlayer play]; }