如果您的应用程序播放视频并暂停背景音频,您如何在完成后让背景音频恢复?

Posted

技术标签:

【中文标题】如果您的应用程序播放视频并暂停背景音频,您如何在完成后让背景音频恢复?【英文标题】:If your app plays video and pauses background audio, how do you get the background audio to RESUME when you're finished? 【发布时间】:2019-01-30 19:29:46 【问题描述】:

我有一个应用程序,用户可以在其中全屏播放视频。这可以通过AVPlayerViewController 轻松完成。

效果很好,但是在用户正在收听播客的情况下,如果他们点击视频进行观看,它会暂停播客以便用户观看视频,但是当我关闭视频我希望播客能够恢复。这是大多数应用程序中的行为,例如,我已经通过 Twitter 和 Tweetbot 确认了这一点。奇怪的是,下面的代码适用于 Apple Podcast(它恢复),但没有其他的,并且像前面提到的 Tweetbot 这样的其他应用程序普遍适用。

但是,我绝对没有运气让这个自己工作。

我尝试过的事情:

仅向 AVPlayerViewController 提供所需的最少代码量:不会恢复。 在AVPlayerViewController 中的viewDidDisappear 调用AVAudiosession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation):不恢复并显示“玩家正忙”错误。 好的,让我们尝试在viewDidDisappear 中使用player?.pause() 手动停止播放器:不会恢复,仍然给出“播放器正忙”错误。 嗯,也许再等一下?尝试在 DispatchQueue.main.asyncAfter 1 秒后调用 setActive?没有错误,但不会恢复。

我已经将它放在一个测试项目中,代码量非常少:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController 
    override func viewDidLoad() 
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.addTarget(self, action: #selector(buttoned(sender:)), for: .touchUpInside)
        button.setTitle("Tap here to view video", for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 19.0)
        button.frame = view.bounds
        view.addSubview(button)
    

    @objc private func buttoned(sender: UIButton) 
        let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        let player = AVPlayer(url: videoURL!)
        let playerViewController = CustomVideoController()
        playerViewController.player = player
        self.present(playerViewController, animated: true) 
            playerViewController.player?.play()
        
    


class CustomVideoController: AVPlayerViewController 
    override func viewDidDisappear(_ animated: Bool) 
        super.viewDidDisappear(animated)

        do 
            try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
         catch 
            print(error)
        
    

这是完整的可编译项目(实际上就是上面的代码):https://drive.google.com/file/d/1oWb-bNIQv5B1KjMkez6BxuEIh_n6eFxH/view

播放来自 Apple Music、Spotify、Overcast 等的内容,然后运行该应用并点击查看视频。

试图弄清楚这个相对微不足道的事情我有点发疯了,因为我确信我只是在做一些非常愚蠢的事情,但任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您是否尝试过使用player 作为成员变量?所以你可以在view消失后销毁它,还没有测试,但是代码应该是这样的:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController 

    var player:AVPlayer?

    override func viewDidLoad() 
        super.viewDidLoad()

        let button = UIButton(type: .system)
        button.addTarget(self, action: #selector(buttoned(sender:)), for: .touchUpInside)
        button.setTitle("Tap here to view video", for: .normal)
        button.titleLabel?.font = UIFont.systemFont(ofSize: 19.0)
        button.frame = view.bounds
        view.addSubview(button)
    

    @objc private func buttoned(sender: UIButton) 
        let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        player = AVPlayer(url: videoURL!)
        let playerViewController = CustomVideoController()
        playerViewController.player = player
        self.present(playerViewController, animated: true) 
            playerViewController.player?.play()
        
    


class CustomVideoController: AVPlayerViewController 
    override func viewDidDisappear(_ animated: Bool) 
        super.viewDidDisappear(animated)
        player.pause()
        player = nil
        do 
            try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
         catch 
            print(error)
        
    

【讨论】:

不幸的是,销毁它似乎没有任何效果。 ://【参考方案2】:

(抱歉,我好像不能离开 cmets)

您是否尝试过在不同的设备上进行测试(使用不同的 iOS 版本?)。您的示例代码在我的 iPhone 6 (iOS 12.1.2) 上运行良好,我测试了音乐和播客。

【讨论】:

Apple 制造的应用程序似乎确实有效,但我找不到任何有效的第三方应用程序。尝试任何其他播放背景音频的应用。

以上是关于如果您的应用程序播放视频并暂停背景音频,您如何在完成后让背景音频恢复?的主要内容,如果未能解决你的问题,请参考以下文章

IOS如何在后台播放音乐声音并暂停当前播放的音乐应用程序

如何使用相同的触发器播放音频和视频

使用播放/暂停/停止按钮控制 Flash 视频的声音

我们如何强制 html 播放 100% 缓冲音频或视频?

如何录制视频并保持音乐在后台播放?

应用程序运行时如何使用MonoTouch播放背景音乐