为什么AVAudioPlayer在拔下耳机时会继续播放?

时间:2018-02-22 11:32:00

标签: ios swift avplayer avaudioplayer

Apple表示拔下耳机后,iOS会自动停止播放。

虽然使用 AVPlayer 时确实如此,但在使用 AVAudioPlayer 时,它实际上无法正常工作,而是音频会继续从内置扬声器播放。

链接到Apple的网站: https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/HandlingAudioHardwareRouteChanges/HandlingAudioHardwareRouteChanges.html

3 个答案:

答案 0 :(得分:1)

我不确定,但试试这个:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSError *setCategoryErr;
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];

    // Detects when the audio route changes (ex: headphones unplugged)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioHardwareRouteChanged:) name:AVAudioSessionRouteChangeNotification object:nil];
    // Don't forget to remove notification in dealloc method!!
}

- (void)audioHardwareRouteChanged:(NSNotification *)notification {
    NSInteger routeChangeReason = [notification.userInfo[AVAudioSessionRouteChangeReasonKey] integerValue];
    if (routeChangeReason == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
        // if we're here, The old device is unavailable == headphones have been unplugged, so stop manually!
        [self.player stop];
    }
}

答案 1 :(得分:1)

您需要观察硬件路径更改观察器并基于回调,您可以停止播放。

设置播放器 - 播放音频(即使在静音模式下)并静音其他音乐:

let audioSession = AVAudioSession.sharedInstance()
_ = try? audioSession.setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers)
_ = try? audioSession.setActive(true)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(audioRouteChanged), name: .AVAudioSessionRouteChange, object: nil)


func audioRouteChanged(note: Notification) {
   if let userInfo = note.userInfo {
       if let reason = userInfo[AVAudioSessionRouteChangeReasonKey] as? Int  {
       if reason == AVAudioSessionRouteChangeReason.oldDeviceUnavailable.hashValue {
       // headphones plugged out
       player.stop()
      }
    }
  }
}

重要说明:如果路径更改原因是AVAudioSessionRouteChangeReasonOldDeviceUnavailable,则媒体播放应用应暂停播放,但如果原因是AVAudioSessionRouteChangeReasonOverride则不应暂停播放。

答案 2 :(得分:1)

来自document you linked to

  

重要:如果路线更改原因为AVAudioSessionRouteChangeReasonOldDeviceUnavailable,则媒体播放应用暂停播放,但如果原因为AVAudioSessionRouteChangeReasonOverride则不应暂停播放。

"宜"可以表明任务的责任或可能性。 在这种情况下,这意味着当耳机等被拔掉并且时,实施暂停是的职责,它可能会在没有任何干预的情况下发生(因为你和已经看过了,它没有。

用新的眼光看待它,文档 含糊不清。应该不是一个好词选择。