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
 {
    
 }