3

我用来AVPlayerViewController在我的应用程序中播放短视频。

如果在用户在我的应用程序中播放视频之前有应用程序在后台播放音频,我希望在我的视频播放器关闭后恢复其他应用程序的背景音频播放。我目前使用AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)这样做。

即使 Apple 的音乐应用程序和 Podcasts 应用程序在我通话后确实恢复播放AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation)- 没有通话就不会恢复,因此这意味着此通话确实有效 - 我测试的任何 3rd 方音乐或播客应用程序(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)
}

起初我认为这可能是这些 3rd 方应用程序的错。但后来我用官方推特应用测试了它们,发现它们可以在推特应用中播放视频后恢复音频播放。

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

PS:这是完整的项目,有兴趣的可以试试。

4

3 回答 3

3

我希望在我的视频播放器关闭后恢复其他应用程序的背景音频播放

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

但是,您并没有完全正确地管理您的音频会话。你应该:

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

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

  • 完成播放后,使用 停用notifyOthersOnDeactivation然后切换回无干扰的音频类别(例如环境)并激活它。

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

于 2017-02-23T15:37:03.960 回答
3

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

于 2017-04-20T15:40:57.847 回答
0

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

于 2017-02-23T05:50:34.893 回答