iPhone OS主要提供以下几种播放音频的方法:
1.System Sound Services
System Sound Services 是最底层也是最简单的声音播放服务,调用AudioServicesPlaySystemSound这个方法就可以播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或者警告音,因为它有很多限制:
1)声音长度要小于30秒
2)In linear PCM或者IMA4(IMA/ADPCM)格式的
3)打包成.caf, .aif ,或者 .wav的文件
4)不能控制播放的进度
5)调用方法后立即播放声音
6)没有循环播放和立体声控制
另外,它还可以调用系统的震动功能,方法也很简单。具体的代码可以参考官方的示例,但是官方的示例只有一些简单的用法,从文档中我们发现可以通过AudioServicesAddSystemSoundCompletion 方法为音频播放添加CallBack 函数,有了CallBack函数我们可以解决不少问题,比如可以克服System Sound Services本身不支持循环播放的问题。
2.AVAudioPlayer 类
AVAudioPlayer是AVFoundation.framework 中定义的一个类,所以使用要先在工程中引入AVFoundation.framework。我们可以把AVAudioPlayer看作是一个高级的播放器,它支持广泛的音频格式,主要是以下这些格式:
AAC
AMR
ALAC
iLBC
IMA4
linearPCM
u-lawanda-law
MP3(MPEG-1audiolayer3)
AVAudioPlayer可以播放任意长度的音频文件、支持循环播放、可以同步播放多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等,更高级的功能可以参考AVAudioPlayer的文档。要使用AVAudioPlayer的对象播放文件,你只需为其指定一个音频文件并设定一个实现了AVAudioPlayerDelegate协议的delegate对象。
只要将AVAudioPlayer的numberOfLoops属性设为负数,音频文件就会一直循环播放直到调用stop方法。
AVAudioPlayer同样支持Callback,这是AVAudioPlayerDelegate的一个可选delegtate方法:
-
}
另外,你可以随时控制AVAudioPlayer对象的播放、暂停以及停止,通过判断对象的状态,分别调用play、pause和stop方法即可:-
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实例,每个相当于混音板上的一个轨道。
一、创建一个播放器
AVAudioPlayer * player =[ [AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"星月神话" ofType:@"mp3"]] error : nil];//使用本地URL创建
AVAudioPlayer * player = [[AVAudioPlayer alloc]initWithData:Data error:nil];//使用NSData创建
我之前讲过AVAudio不可以播放网络URL,但是可以播放NSData,我们似乎受到启发,我们可以通过网络URL去创建NSData,然后再通过AVAudioPlayer 来播放NSData,这样是不是就可以播放网络音乐了?但是此法并不可取,因为AVAudioPlayer只能播放一个完整的文件,并不支持流式播放,所以必须是缓冲完才能播放,所以如果网络文件过大抑或是网速不够岂不是要等很久?所以播放网络音频我们一般用音频队列。
二、播放器属性
创建一个AVAudioPlayer以后你就可以对它的各种属性进行访问或设置了。
1.音量
player.volume = 0.8// 0.0 - 1.0之间
2、循环次数
player.numberOfLoops = 3;//默认只播放一次
3、播放位置
player.currentTime = 15.0;//可以指定从任意位置开始播放
4、声道数
NSUInteger channels = player.numberOfChannels;//只读属性
5、持续时间
NSTimeInterval duration = player.duration;//获取持续时间
6、仪表计数
player.meteingEnabled = YES; //开启仪表计数功能
[player updateMeters];//更新仪表计数
三、播放声音
[player prepareToPlay];//分配播放所需的资源,并将其加入内部播放队列
[player play];//播放
[player stop];//停止
四、代理方法
这个类对应的AVAudioPlayerDelegater的委托方法。audioPlayerDidFinishPlaying:sucessfully:当音频播放完成后触发。当播放完成之后,可以将播放按钮的文本重新回设置成Play Audio File
- (void)audioPlayerDidFinishPlay
{
}
- (void)audioPlayerDecodeErrorDi
{
}
- (void)audioPlayerBeginInterrup
{
}
audioPlayerEndInterruption:当程序被应用外部打断之后,重新回到应用程序的时候触发。在这里当回到此应用程序的时候,继续播放音乐。
- (void)audioPlayerEndInterrupti
{
}
=====================================================================================================================================
that's all.
http://blog.sina.com.cn/s/blog_a843a8850101k0d5.html