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 失败 
        }
    });
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
iOS上的AVAudioPlayer提供了一种方便的方式来进行音频播放,包括后台播放。在后台播放音频时,我们需要遵循特定的设置和步骤。 首先,我们需要在应用程序的Capabilities选项卡中启用后台模式。在Xcode中找到应用程序的Targets,然后点击Capabilities选项卡,将“Background Modes”开关打开,并勾选“Audio, AirPlay, and Picture in Picture”。 然后,在代码中设置AVAudioSession的类别为AVAudioSessionCategoryPlayback。这可以通过以下代码实现: ``` import AVFoundation let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(.playback, options: .defaultToSpeaker) try audioSession.setActive(true) } catch { print("设置音频会话类别失败: \(error)") } ``` 接下来,我们需要在应用程序的AppDelegate类中创建一个后台任务。当我们按下Home键离开应用程序时,这个后台任务将会被激活。 ``` func applicationDidEnterBackground(_ application: UIApplication) { backgroundTask = application.beginBackgroundTask(withName: "PlayAudioInBackground", expirationHandler: { application.endBackgroundTask(self.backgroundTask) self.backgroundTask = UIBackgroundTaskIdentifier.invalid }) } ``` 然后,创建一个AVAudioPlayer实例来播放音频文件。我们可以使用它的`play`方法来开始播放音频。 ``` let audioURL = Bundle.main.url(forResource: "audio", withExtension: "mp3") do { audioPlayer = try AVAudioPlayer(contentsOf: audioURL!) audioPlayer.prepareToPlay() audioPlayer.play() } catch { print("无法播放音频文件: \(error)") } ``` 在音频播放完成或者我们不再需要后台任务时,需要结束后台任务。 ``` func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { if flag { // 当音频播放完成时调用 audioPlayer.stop() UIApplication.shared.endBackgroundTask(backgroundTask) backgroundTask = UIBackgroundTaskIdentifier.invalid } } ``` 通过以上设置,我们可以确保AVAudioPlayer在应用程序进入后台时继续播放音频。但需要记住,长时间背景播放可能会影响设备的电池寿命,所以请确保仅在必要时使用后台播放功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yusirxiaer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值