【问题标题】: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 等的内容,然后运行该应用并点击查看视频。

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

【问题讨论】:

    标签: ios avfoundation avplayer avaudioplayer avkit


    【解决方案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 制造的应用程序似乎确实有效,但我找不到任何有效的第三方应用程序。尝试任何其他播放背景音频的应用。
    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多