在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。没有音效的软件是残缺的,用户体验也会大打折扣,下面是自己对iPhone音频的一点总结。
iPhone OS 音频分类:
Sound effects音响效果:
iPhone OS 主要提供以下了几种播放音频的方法:
1. static void completionCallback (SystemSoundID mySSID) { 2. // 音频重放 3. AudioServicesPlaySystemSound(mySSID); 4. } 5. - (void) playSound { 6. // 获得 main bundle 7. CFBundleRef mainBundle; 8. SystemSoundID soundFileObject; 9. mainBundle = CFBundleGetMainBundle (); 10. // 获得声音文件的URL 11. CFURLRef soundFileURLRef = CFBundleCopyResourceURL ( 12. mainBundle, 13. CFSTR ("background"), 14. CFSTR ("wav"), 15. NULL 16. ); 17. // 创建 system sound 对象 18. AudioServicesCreateSystemSoundID ( 19. soundFileURLRef, 20. &soundFileObject 21. ); 22. // 播放结束回调 23. AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL, 24. completionCallback, 25. (void*) self); 26. // 播放音频 27. AudioServicesPlaySystemSound(soundFileObject); 28. 29. }
2. AVAudioPlayer 类
1. - (void) playBackgroundSoundEffect { 2. NSString *soundFilePath = 3. [[NSBundle mainBundle] pathForResource: @"background" 4. ofType: @"wav"]; 5. NSURL *fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 6. AVAudioPlayer *newPlayer = 7. [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL 8. error: nil]; 9. [fileURL release]; 10. self.player = newPlayer; 11. [newPlayer release]; 12. [self.player prepareToPlay]; 13. [self.player setDelegate: self]; 14. self.player.numberOfLoops = -1; // 循环播放音频,直到调用Stop方法 15. [self.player play]; 16. }
可 以看到,只要将 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.player.playing) { [self.player pause]; } else { [self.player play]; }
虽 然 AVAudioPlayer 可以播放很多格式,但是我们在实际开发过程中还是最好使用一些没有压缩的格式,比如 WAVE 文件,这样可以减少系统处理单元的资源占用,以便更好的完成程序的其他功能。另外,在使用 AVAudioPlayer 连续播放 mp3 这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。