首页 > 解决方案 > 如果想在应用程序中将正在播放的视频静音时恢复用户的背景音频,如何以最小的中断最好地做到这一点?

问题描述

为标题道歉,解释起来有点棘手。

想象一下,用户在使用我的应用程序时正在后台收听 Spotify 或其他东西,然后他们点击视频来播放它。视频默认为静音,因此 Spotify 会继续播放。然后用户点击取消静音,因此 Spotify 将暂停,现在取消静音的视频音频将开始播放。

现在,事实证明视频的音频不是那么有趣,并且用户更喜欢听他们的音乐,所以这次用户点击静音,所以视频的音频停止并且 Spotify 应该恢复。

最后一点是障碍,当您将应用程序的音频会话设置为非活动时,它似乎需要暂停播放视频。我不希望它被暂停,我希望它继续播放(只是没有音频),但出于某种原因,这似乎是一种要求。

因此,作为回应,您似乎可以跳A)暂停视频,B)将音频会话设置为非活动状态,从而重新启用Spotify,C)取消暂停视频。但是如果你跳得太快,iOS 会生气,并把它当作你根本没有暂停它,可能会干扰视频的播放和输出:

停用正在运行 I/O 的音频会话。在停用音频会话之前,应停止或暂停所有 I/O

虽然没有完成处理程序或任何东西(我可以看到)来帮助您何时应该重新启用任何暂停的视频或诸如此类的东西,所以我使用了这段粗略的代码,我在其中引入了人为(猜测的)延迟:

// Pause it
player.pause()
videoControlsView?.isPaused = true

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
    // Wait 0.1 seconds, set audio to inactive
    do {
        try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: [])
        try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
    } catch {
        print(error)
    }

    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
        // Wait 0.1 seconds, unpause
        player.play()
        player.isMuted = true
        self.videoControlsView?.isMuted = true
    }
}

但是尽管进行了相当多的测试,这段代码显然非常脆弱,不是我写过的最喜欢的。有没有合适的方法来做到这一点?

注意:激活(而不是停用)音频会话没有此类问题。

标签: iosavfoundationavplayeravaudiosessionavkit

解决方案


推荐阅读