http://zys-wings.com/?p=450
iPhone OS 主要提供以下了几种播放音频的方法:
System Sound Services
AVAudioPlayer 类
Audio Queue Services
OpenAL
1. System Sound Services
System Sound Services 是最底层也是最简单的声音播放服务,调用
AudioServicesPlaySystemS
■ 声音长度要小于 30 秒
■ In linear PCM 或者 IMA4 (IMA/ADPCM) 格式的
■ 打包成 .caf, .aif, 或者 .wav 的文件
■ 不能控制播放的进度
■ 调用方法后立即播放声音
■ 没有循环播放和立体声控制
另外,它还可以调用系统的震动功能,方法也很简单。具体的代码可以参考官方的示例
, 但是官方的示例只有一些简单的用法,从文档中我们发现可以通过
AudioServicesAddSystemSo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
static void completionCallback
(SystemSoundID //
Play again after sound play completion AudioServicesPlaySystemS } - ( void ) playSound
{ //
Get the main bundle for the app CFBundleRef
mainBundle; SystemSoundID
soundFileObject; mainBundle
= CFBundleGetMainBundle (); //
Get the URL to the sound file to play CFURLRef
soundFileURLRef mainBundle, CFSTR
( "background" ), CFSTR
( "wav" ), NULL ); //
Create a system sound object representing the sound
file AudioServicesCreateSyste soundFileURLRef, &soundFileObject ); //
Add sound completion callback AudioServicesAddSystemSo completionCallback, ( void *)
self); //
Play the audio AudioServicesPlaySystemS } |
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
可以播放任意长度的音频文件、支持循环播放、可以同步播放多个音频文件、控制播放进度以及从音频文件的任意一点开始播放等,更高级的功能可以参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
- ( void )
playBackgroundSoundEffec 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;
// Loop playback until invoke stop method [self.player
play]; } |
可以看到,只要将 AVAudioPlayer 的 numberOfLoops
属性设为负数,音频文件就会一直循环播放直到调用 stop 方法。
AVAudioPlayer 同样支持 Callback,这是 AVAudioPlayerDelegate 的一个可选
delegate 方法:
- (void) audioPlayerDidFinishPlay
}
另外,你可以随时控制 AVAudioPlayer 对象的播放、暂停以及停止,通过判断对象的状态,分别调用
play、pause 和 stop 方法即可:
- (IBAction) playOrPause: (id) sender
{
虽 然 AVAudioPlayer 可以播放很多格式,但是我们在实际开发过程中还是最好使用一些没有压缩的格式,比如
WAVE 文件,这样可以减少系统处理单元的资源占用,以便更好的完成程序的其他功能。另外,在使用 AVAudioPlayer 连续播放
mp3 这类经过压缩的音频文件时,在连接处可能出现一定的间隔时间。
iOS4 后台播放音乐最简单的方法
打开你的XXX-Info.plist增加一项
Required background modes 默认是数组,在其下增加一个元素
然后在你播放音乐的代码前增加一行
[[AVAudioSession sharedInstance]
setCategory:AVAudioSessionCategoryPl
注意模拟器是不能展示后台效果的,不要实现了功能还以为没实现,请用真机测试
3.MPMusicPlayerController
引入MediaPlayer.framework
4. Audio Queue Services
如果以上两种音频播放的解决方案都无 法满足你的需求,那么我想你肯定需要使用 Audio Queue Services。使用
Audio Queue Services
对音频进行播放,你可以完全实现对声音的控制。例如,你可以在声音数据从文件读到内存缓冲区后对声音进行一定处理再进行播放,从而实现对音频的快速/慢速
播放的功能。
因为 Audio Queue Services 相对复杂很多,Apple
官方已经把它整理为一本书了,具体可以参考
播放流音频源代码:http://code4app.com/ios/在线音频播放器/4ffc45006803fa9e19000000
5. OpenAL
OpenAL 是一套跨平台的开源的音频处理接口,与图形处理的 OpenGL
类似,它为音频播放提供了一套更加优化的方案。它最适合开发游戏的音效,用法也与其他平台下相同。
iPhone 支持 OpenAL 1.1,我没有在实际开发中使用过,具体的文档可以参考 OpenAL
的网站