iPhone 应用开发:音频播放
在 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 这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。
转载自:
http://www.cnblogs.com/lm3515/archive/2010/08/28/1811109.html