如何在解雇AVPlayerViewController后恢复其他应用的音频播放?

时间:2017-02-23 05:39:21

标签: ios audio avfoundation avplayerviewcontroller avkit

我使用AVPlayerViewController在我的应用中播放短视频。

如果有一个应用在用户在我的应用中播放视频之前在后台播放音频,我希望在我的视频播放器被解除后,其他应用的背景音频播放恢复。我目前使用AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)来做到这一点。

即使Apple的音乐应用程序和Podcasts应用程序在我拨打AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)后仍然恢复播放 - 如果没有通话将无法恢复,这意味着此通话确实有效 - 没有第三方音乐或播客应用我测试(Spotify,SoundCloud,亚马逊音乐,阴云)。

这是我的代码:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    // I know it's not the best place to call setActive nor it covers all the cases. It's just a convenient place to put the code to test its effect after dismissing the video player.
    do {
        try AVAudioSession.sharedInstance().setActive(false, with: .notifyOthersOnDeactivation)
    } catch {
        print(error)
    }
}

@IBAction func play(_ sender: Any) {
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch {
        print(error)
    }

    let playerController = AVPlayerViewController()
    playerController.player = AVPlayer(url: URL(string: "http://gslb.miaopai.com/stream/UkjiD45ddxZFQ79I2bLaGg__.mp4")!)
    playerController.player?.play()
    present(playerController, animated: true)
}

起初我认为可能是这些第三方应用程序的错。但后来我用官方Twitter应用程序对它们进行了测试,结果发现他们可以在Twitter应用程序中播放视频后恢复音频播放。

那我错过了什么?在我的应用中播放视频后,我应该怎么做才能让这些第三方应用恢复音频播放,就像Twitter应用一样?

PS:这是完整的project所以任何有兴趣的人都可以试试。

3 个答案:

答案 0 :(得分:3)

现在我可以确认这是一个错误:https://openradar.appspot.com/31733529。这个错误在iOS 11中得到修复。

答案 1 :(得分:2)

  

我想在我的视频播放器被解雇后恢复其他应用的背景音频播放

您需要接受这不取决于您。 所能做的就是正确管理你的音频会话。是否有其他应用程序“接受提示”并恢复其音频不在您的掌控之中。

但是,您正确管理您的音频会话。你应该:

  • 一般使用非干扰类别(例如Ambient)。

  • 更改为您的播放类别并仅在您需要时将其激活 (即仅在我们实际即将播放时)

  • 完成播放后,使用notifyOthersOnDeactivation取消激活,然后切换回非干扰音频类别(例如Ambient)并激活它。

一旦你完成了这些事情,你已经做了所有你能做的事情。有些应用会恢复,有些则不会。

答案 2 :(得分:0)

您需要实施AVAudioSession通知。 。对于每次中断或当您的应用程序完成播放媒体文件时,它将触发通知,然后您可以从设备库恢复已暂停的媒体文件。