在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。没有音效的软件是残缺的,用户体验也会大打折扣,下面是自己对iPhone音频的一点总结。
iPhone OS 音频分类:
Sound effects音响效果:
iPhone OS 主要提供以下了几种播放音频的方法:
static void completionCallback (SystemSoundID mySSID) {
// 音频重放
AudioServicesPlaySystemSound(mySSID);
}
- (void) playSound {
// 获得 main bundle
CFBundleRef mainBundle;
SystemSoundID soundFileObject;
mainBundle = CFBundleGetMainBundle ();
// 获得声音文件的URL
CFURLRef soundFileURLRef = CFBundleCopyResourceURL (
mainBundle,
CFSTR ("background"),
CFSTR ("wav"),
NULL
);
// 创建 system sound 对象
AudioServicesCreateSystemSoundID (
soundFileURLRef,
&soundFileObject
);
// 播放结束回调
AudioServicesAddSystemSoundCompletion (soundFileObject, NULL, NULL,
completionCallback,
(void*) self);
// 播放音频
AudioServicesPlaySystemSound(soundFileObject);
}
2. AVAudioPlayer 类
- (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; // 循环播放音频,直到调用Stop方法
[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.");
}
}
-(IBAction) playOrPause: (id) sender {
// 音频控制逻辑
if (self.player.playing) {
[self.player pause];
} else {
[self.player play];
}
虽 然 AVAudioPlayer 可以播放很多格式,但是我们在实际开发过程中还是最好使用一些没有压缩的格式,比如 WAVE 文件,这样可以减少系统处理单元的资源占用,以便更好的完成程序的其他功能。另外,在使用 AVAudioPlayer 连续播放 mp3 这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。