學習總是在進行。
一、AVAudioPlayer如何處理中斷
AVAudioPlayer類提供了代理方法,用來處理當播放音頻文件時,發生來電、鬧鐘等事件。設置代理并遵守AVAudioPlayerDelegate協議,<span style="font-family: Arial, Helvetica, sans-serif;">AVAudioPlayerDelegate中提供的代理方法</span>
二、AVAudioPlayer代理方法實現
看例子:
1.加入音頻相應的框架到項目中。
#import2.聲明音頻播放類,并且實現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;// 設置 delegateif ([self.audioPlayer prepareToPlay] && [self.audioPlayer play]){// 播放成功 }else {// 播放失敗 }}else {// 初始化 AVAudioPlayer 失敗 }});