iOS 音频播放
iphone OS主要提供以下4种播放音频的方法。
Sestem Sound Services、AVAudioPlayer类、Audio Queue Services、OpenAL
1.Sestem Sound Services
Sestem Sound Services是最底层的也是最简单的声音播放服务,调用AudioServicesPlaySystemSound这个方法就可以播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或警告音,因为他有很多限制:
{
声音长度要小于30秒
In linear PCM或者IMA4(IMA/ADPCM)格式的
打包成.caf,.aif,或者.wav的文件
不能控制播放的进度
调用方法后立即播放声音
没有循环播放和立体声音控制
}
另外,他还可以调用系统的震动功能。还可以通过AudioServices
AddSystemSoundCompletion方法为音频播放添加CallBack函数,有了CallBack函数我们可以解决不少问题,比如可以克服System Sound Services本身不支持循环播放的问题。
一下代码可以实现在一个程序中循环播放背景音乐:
- static void completionCallback(SystemSoundID mySSID)
- {
- AudioServicesPlaySystemSound(mySSID);
- }
- -(void)playSound
- {
- CFBundleRef mainBundle;
- SystemSoundID soundFileObject;
- mainBundle=CFBundleGetMainBundle();
- CFURLRef soundFileURLRef=CFBundleCopyResourceURL(
- mainBundle,CFSTR("background"),CFSTR("wav"),NULL);
- AudioServicesCreateSystemSoundID(
- soundFileURLRef,&soundFileObject);
- AudioServicesAddSystemSoundCompletion(soundFileObject,NULL,NULL,completionCallback,(void*)self);
- AudioServicesPlaySystemSound(soundFileObject);
- }
2.AVAudioPlayer类
AVAudioPlayer是AVFoundation.framework中定义的一个类,所以使用前要在工程中引入AVFoundation.framework。可以把AVAudioPlayer看做是一个高级播放器,它支持广泛的音频格式,主要有:
{
AAC、AMR(AdaptiveMulti-Rate,aformatforspeech)、ALAC(AppleLossless)、iLBC(internetLowBitrateCodec,anotherformatforspeech)、IMA4(IMA/ADPCM)、linearPCM、u-lawanda-law、mp3
}AVAudioPlayer可以播放任意长度的音频文件、支持循环播放、可以同步播放很多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等,要使用AVAudioPlayer的对象播放文件,只需要为其指定一个音频文件设定一个实现了AVAudioPlayerDelegate协议的delegate对象。下边的例子和上边的一样实现一直循环播放背景音乐:
- -(void)playBackgroundSoundEffect
- {
- NSString *soundFilePath=[[NSBundle mainBundle] pathForResource:@"background",ofType@"wav"];
- NSURL *fileURL=[[NSURL alloc]initFileURLWithPath:soundFilePath];
- AVAudioPlayer *newPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
- [fileURL release];
- self.player=newPlayer;
- [newPlayer release];
- [self.player prepareToplay];
- [self.player setDelegate:self];
- self.player.numberOfLoops=-1;
- [self.player play];
- }
可以看到,只要将AVAudioPlayer的numberOfLoops属性设为负数,音频文件就会一直循环播放直到调用stop方法。
AVAudioPlayer同样支持Callback,这是AVAudioPlayerDelegate的一个可选delegate方法。
- -(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(self.playing){[self.player pause];}
- else{[self.player play];}
虽然AVAudioPlayer可以播放很多格式,但是我们在实际开发过程中还是最好使用一些没有压缩的格式,比如WAVE文件,这样可以减少系统处理单元的资源占用,以更好的完成程序的其他功能。另外,在使用AVAudioPlayer连续播放mp3这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。
3.Audio Queue Services
如果以上两种音频播放的解决方案都无法满足你的需求,可以使用Audio Queue Services,使用Audio Queue Services可以实现对声音的控制。例如,可以在声音数据从文件读到缓冲区后对声音进行一定处理再进行播放,从而实现对音频的快慢播放的功能。
4.OpenAL
OpenAL是一套跨平台开源的音频处理接口,与图形处理的OpenGL类似,它为音频播放提供了一套更加优化的方案,它适合开发游戏的音效,用法也与其他平台下相同。