1. 程式人生 > >iOS AVAudioPlayer和AVAudioPlayerDelegate-音訊播放處理中斷

iOS AVAudioPlayer和AVAudioPlayerDelegate-音訊播放處理中斷

學習總是在進行。
一、AVAudioPlayer如何處理中斷
AVAudioPlayer類提供了代理方法,用來處理當播放音訊檔案時,發生來電、鬧鐘等事件。設定代理並遵守AVAudioPlayerDelegate協議,<span style="font-family: Arial, Helvetica, sans-serif;">AVAudioPlayerDelegate中提供的代理方法</span>

二、AVAudioPlayer代理方法實現
看例子:

1.加入音訊相應的框架到專案中。
#import

2.宣告音訊播放類,並且實現AVAudioPlayerDelegate協議

@interface SquareViewController : UIViewController<AVAudioPlayerDelegate>{
    AVAudioPlayer *_audioPlayer;
}
@property (nonatomic,retain)AVAudioPlayer *audioPlayer;

3.實現AVAudioPlayerDelegate協議方法。

 
#pragma mark - AVAudioPlayerDelegate

// 音訊播放完成時
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
    // 音訊播放完成時,呼叫該方法。
    // 引數flag:如果音訊播放無法解碼時,該引數為NO。
    //當音訊被終端時,該方法不被呼叫。而會呼叫audioPlayerBeginInterruption方法
        // 和audioPlayerEndInterruption方法
     


}

// 解碼錯誤 
- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error{
    NSLog(@"解碼錯誤!");


}

// 當音訊播放過程中被中斷時
- (void)audioPlayerBeginInterruption:(AVAudioPlayer *)player{
    // 當音訊播放過程中被中斷時,執行該方法。比如:播放音訊時,電話來了!
    // 這時候,音訊播放將會被暫停。
}

// 當中斷結束時 
- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags{

    // AVAudioSessionInterruptionFlags_ShouldResume 表示被中斷的音訊可以恢復播放了。
  // 該標識在iOS 6.0 被廢除。需要用flags引數,來表示視訊的狀態。
     
    NSLog(@"中斷結束,恢復播放");
    if (flags == AVAudioSessionInterruptionFlags_ShouldResume && player != nil){
        [player play];
    }

}

//- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withFlags:(NSUInteger)flags {
//
//    //該方法在iOS 6.0 中被廢除
//    if (flags == AVAudioSessionInterruptionFlags_ShouldResume && player != nil){
//        [player play];
//    }
//
//}
//
//- (void)audioPlayerEndInterruption:(AVAudioPlayer *)player{
//    //該方法被廢除
//
//}


注意:因為以上兩個方法在iOS 6.0 已經被廢除。故註釋。

4.使用音訊播放器播放音訊檔案

//非同步載入音訊播放器進行播放
    self.view.backgroundColor = [UIColor whiteColor];
    dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(dispatchQueue, ^(void) {
        NSBundle *mainBundle = [NSBundle mainBundle];
        NSString *filePath = [mainBundle pathForResource:@"mySong" ofType:@"mp3"];
        NSData *fileData = [NSData dataWithContentsOfFile:filePath];
        NSError *error = nil;
        // 初始化音訊控制器 
        self.audioPlayer = [[AVAudioPlayer alloc] initWithData:fileData error:&error];
        if (self.audioPlayer != nil){
            
            self.audioPlayer.delegate = self;// 設定 delegate
            if ([self.audioPlayer prepareToPlay] && [self.audioPlayer play]){
                // 播放成功 
            }
            else {
                // 播放失敗 
            }
        }
        else {
            // 初始化 AVAudioPlayer 失敗 
        }
    });