iOS AVAudioPlayer和AVAudioPlayerDelegate-音訊播放處理中斷
阿新 • • 發佈:2019-02-12
學習總是在進行。
一、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 失敗 } });