AVAudioPlayer是AVFoundation.framework里面最基本的一个音频播放器的类。它与MPMediaPlayerController在一些基本操作功能上是类同的,比如play,pause,volume等等。
不一样的地方在于AVAudioPlayer没有队列这个东西,也就是说它只能播放一个指定路径的音频。要播放多个音频,可以通过创建多个AVAudioPlayer来实现。在AVFoundation里面,有另外一个功能强大的类AVQueuePlayer,基本上要做音乐播放器要靠它,什么QQ音乐,酷狗应该都是使用AVQueuePlayer。关于AVQueuePlayer的使用,将在之后的博文中讲述。
那么AVAudioPlayer有什么用呢?
AVAudioPlayer能实现的功能类似于System Audio Services,播放单一音频,但它不同的地方在于它可以控制播放的次数,播放的时间。比如用它可以很方便的实现重复播放。另外,它还有一个很强大的功能,就是可以很方便的调节左右声道的音量,从而实现很酷的立体声效果。从这个角度看,AVAudioPlayer很适用于游戏中的音频播放。比如纸牌游戏中洗牌时就可以重复播放洗牌时的音频直到洗牌结束。
下面开始介绍AVAudioPlayer的具体使用。
STEP 1:设置Audio Session
要记住,使用AVFoundation的东西播放音频,肯定要先对Audio Session进行设置,除非你使用默认的设置。关于Audio Session的设置,详见之前的博文。
下面是示例:
[plain]
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
STEP 2:初始化AVAudioPlayer
示例代码:
[plain]
NSURL *musicOneURL = [[NSBundle mainBundle] URLForResource:@"十年" withExtension:@"mp3"];
self.audioPlayerOne = [[AVAudioPlayer alloc] initWithContentsOfURL:musicOneURL error:nil];
NSURL *musicOneURL = [[NSBundle mainBundle] URLForResource:@"十年" withExtension:@"mp3"];
self.audioPlayerOne = [[AVAudioPlayer alloc] initWithContentsOfURL:musicOneURL error:nil];
STEP 3:设置AVAudioPlayer
AVAudioPlayer有一个重要的property就是pan,用它可以来调节音频播放时左右声道的大小,如果值是-1.0为完全左声道发生,如果是1.0则为完全右声道发音。
另外,还有一个很强大的功能,就是可以测量音频播放时实时声道的功率大小,这个功能可以用于辅助显示声音的波浪,很多电脑上的播放器都有的。当然,如果用它来进行声波的分析,我想也是可以的。
示例代码:
[plain]
// audioPlayerOne 为一个AVAudioPlayer的对象
self.audioPlayerOne.meteringEnabled = YES; // 允许测量
[self.audioPlayerOne updateMeters]; // 更新数据
[self.averagePowerChannelOne setValue:[self.audioPlayerOne averagePowerForChannel:0] animated:YES]; // 将获取的数据赋予相关的控件
[self.averagePowerChannelTwo setValue:[self.audioPlayerOne averagePowerForChannel:1] animated:YES];
// audioPlayerOne 为一个AVAudioPlayer的对象
self.audioPlayerOne.meteringEnabled = YES; // 允许测量
[self.audioPlayerOne updateMeters]; // 更新数据
[self.averagePowerChannelOne setValue:[self.audioPlayerOne averagePowerForChannel:0] animated:YES]; // 将获取的数据赋予相关的控件
[self.averagePowerChannelTwo setValue:[self.audioPlayerOne averagePowerForChannel:1] animated:YES];
STEP 4:控制
示例代码:
[plain]
[self.audioPlayerOne prepareToPlay]; // 准备数据,播放前必须设置
[self.audioPlayerOne setNumberOfLoops:-1]; // 设置为-1可以实现无限循环播放
[self.audioPlayerOne setRate:1.5f]; // 设置播放速度
[self.audioPlayerOne setPan:1.0f]; // 设置左右声道
[self.audioPlayerOne setCurrentTime:20.0f]; // 设置播放时间
[self.audioPlayerOne play]; // 播放
[self.audioPlayerOne pause]; // 暂停
[self.audioPlayerOne stop]; // 停止
[self.audioPlayerOne prepareToPlay]; // 准备数据,播放前必须设置
[self.audioPlayerOne setNumberOfLoops:-1]; // 设置为-1可以实现无限循环播放
[self.audioPlayerOne setRate:1.5f]; // 设置播放速度
[self.audioPlayerOne setPan:1.0f]; // 设置左右声道
[self.audioPlayerOne setCurrentTime:20.0f]; // 设置播放时间
[self.audioPlayerOne play]; // 播放
[self.audioPlayerOne pause]; // 暂停
[self.audioPlayerOne stop]; // 停止
STEP 5: Delegate
有时根据需要可以设置AVAudioPlayer的delegate,这样在播放结束时可以进行一些相关的操作
示例代码:
[plain]
// 完成播放
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (flag) {
NSLog(@"play succeed");
}
}
// 播放中断结束后,比如突然来的电话造成的中断
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{
}
// 完成播放
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if (flag) {
NSLog(@"play succeed");
}
}
// 播放中断结束后,比如突然来的电话造成的中断
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags
{
}