iPhone 应用开发:音频播放在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必不可少的。没有音效的软件是残缺的,用户体验也会大打折扣,下面是自己对iPhone音频的一点总结。
(1)High level, easy to use
•System Sound API - short sounds •AVAudioPlayer class - ObjC, simple API (2)Lower level, takes more effort but much more control •Audio Toolbox - recording and playback, streaming, full control •Audio Units - processing audio •OpenAL Sound effects音响效果: •Button Clicks •Alert Sounds •Short Sounds Accompanying User Actions iPhone OS 主要提供以下了几种播放音频的方法: •System Sound Services •AVAudioPlayer 类 •Audio Queue Services •OpenAL 1. System Sound Services System Sound Services 是最底层也是最简单的声音播放服务,调用 AudioServicesPlaySystemS ound 这个方法就可以播放一些简单的音频文件,使用此方法只适合播放一些很小的提示或者警告音,因为它有很多限制: ■ 声音长度要小于 5 秒(一说小于30秒) ■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的 ■ 打包成 .caf, .aif, 或者 .wav 的文件 ■ 不能控制播放的进度 ■ 调用方法后立即播放声音 ■ 没有循环播放和立体声控制 另外,它还可以调用系统的震动功能,方法也很简单。具体的代码可以参考官方的示例SysSound,但是官方的示例只有一些简单的用法,从文档中我们发现 可以通过 AudioServicesAddSystemSoundCompletion 方法为音频播放添加 CallBack 函数,有了 CallBack 函数我们可以解决不少问题,比如可以克服 System Sound Services 本身不支持循环播放的问题。以下代码可以实现一个在程序中循环播放的背景音乐: 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 类
AVAudioPlayer 是 AVFoundation.framework 中定义的一个类,所以使用要先在工程中引入 AVFoundation.framework。我们可以把 AVAudioPlayer 看作是一个高级的播放器,它支持广泛的音频格式,主要是以下这些格式:
■ AAC ■ AMR(AdaptiveMulti-Rate, aformatforspeech) ■ ALAC( AppleLossless) ■ iLBC(internetLowBitrateCodec, anotherformatforspeech) ■ IMA4(IMA/ADPCM) ■ linearPCM(uncompressed) ■ µ-lawanda-law ■ MP3(MPEG-1audiolayer3 AVAudioPlayer 可以播放任意长度的音频文件、支持循环播放、可以同步播放多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等,更高级的功能可以参考 AVAudioPlayer 的文档。要使用 AVAudioPlayer 的对象播放文件,你只需为其指定一个音频文件并设定一个实现了 AVAudioPlayerDelegate 协议的 delegate 对象。这里举一个简单的例子,和上一个例子一样,实现一直循环播放的背景音乐: 1. - (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];
}
- ( void ) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag { |
if (player == self.player && flag == YES) { |
NSLog( @"Playback finish." ); |
} |
} |
1 |
-( IBAction ) playOrPause: ( id ) sender { |
2 |
// 音频控制逻辑 |
3 |
if ( self .player.playing) { |
4 |
[ self .player pause]; |
5 |
} else { |
6 |
[ self .player play]; |
7 |
} |
转自: http://hi.baidu.com/%CB%BC%C3%F4%D3%EA/blog/item/9ed668863484a033c75cc371.html