【问题标题】:How to resume audio playing of other apps after dismissing AVPlayerViewController?关闭 AVPlayerViewController 后如何恢复其他应用程序的音频播放?
【发布时间】:2017-07-13 11:20:25
【问题描述】:

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

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

即使 Apple 的音乐应用程序和 Podcasts 应用程序在我拨打 AVAudioSession.setActive(false, with: .notifyOthersOnDeactivation) 后确实恢复播放——没有呼叫就不会恢复,因此这意味着此呼叫确实有效——我测试的第 3 方音乐或播客应用程序都没有( 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:这里有完整的project,有兴趣的可以试试。

【问题讨论】:

    标签: ios audio avfoundation avplayerviewcontroller avkit


    【解决方案1】:

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

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

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

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

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

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

      李>

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

    【讨论】:

    • 您好,感谢您的回答。您是否使用任何 3rd 方应用程序测试过您的方式?正如我所说,如果仅适用于 Apple 的音乐和播客应用程序,只需使用 notifyOthersOnDeactivation 停用即可。我已根据您的建议更新了我的代码,但它仍然无法恢复 3rd 方应用程序。最初我也怀疑是这些应用程序的错,但后来我用 Twitter 应用程序测试了它们,发现它们在 Twitter 上播放视频后可以恢复。所以肯定有什么我们错过了。
    • 我使用 my 应用程序进行了测试,该应用程序侦听以 shouldResume 选项结尾的中断,我所说的确实有效。显然我不知道 Twitter 是做什么的。
    • 有趣。所以这些流行的 3rd 方应用程序都没有正确实现音频播放恢复,但 Twitter 不知何故找到了解决他们错误的方法? ? 无论如何谢谢。
    • @an0 我认为这不是真的。 AVAudioSession 是一个操作系统会话队列,Twitter 没有做任何不寻常的事情,他们只是让它正确实现。我用 Apple Music、Spotify 和其他一些音乐应用程序测试了 Twitter,它运行良好。但是我的应用程序无法恢复背景音乐,或者有时它确实恢复了,然后在视频显示为静音状态时暂停了片刻。这告诉我我做错了什么,我确实是。
    【解决方案2】:

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

    【讨论】:

    • 我目前仍然看到这个问题在 iOS 11 上使用 AVPlayer、AVAudioPlayer 和 AVAudioEngine 中断 Spotify(中断后,它不会恢复)。您的项目不再在线。您是否已验证它已在 iOS 11 中修复?
    • 我没有代码,但我确信 AVPlayerViewController 的这个错误已在 iOS 11 中修复。我的应用程序正在使用它,它工作正常。我不确定直接使用AVPlayer
    • 我认为问题与远程控制事件有关;您使用的是 MPRemoteCommandCenter 还是 beginReceivingRemoteControlEvents?
    • 不,我没有使用它。抱歉,我帮不上忙。
    • 我认为AVPlayer 的问题仍然存在。
    【解决方案3】:

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

    【讨论】:

    • AVAudioSessionDelegate?来自文档:“在 iOS 6 及更高版本中不推荐使用此协议。相反,您应该使用在 AVAudioSession 中声明的通知。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2013-01-28
    相关资源
    最近更新 更多