如果您的应用播放视频并暂停背景音频,完成后如何将背景音频恢复到RESUME?

时间:2019-01-30 19:29:46

标签: ios avfoundation avplayer avaudioplayer avkit

我有一个可以让用户全屏播放视频的应用程序。使用AVPlayerViewController非常简单地完成此操作。

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

但是我绝对没有运气让它自己工作。

我尝试过的事情:

  • 只显示AVPlayerViewController所需的最少代码量:不会恢复。
  • viewDidDisappear的{​​{1}}上调用AVPlayerViewController:不会恢复,并显示“玩家忙”错误。
  • 好的,让我们尝试使用AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)中的player?.pause()手动停止播放器:不会继续播放,仍然会显示“播放器忙”错误。
  • 嗯,也许再说一遍?尝试在viewDidDisappear 1秒后致电setActive吗?没有错误,但不会继续。

我已经用很少的代码将它放在了一个测试项目中:

DispatchQueue.main.asyncAfter

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

播放诸如Apple Music,Spotify,Overcast之类的内容,然后运行该应用并点按观看视频。

我想弄清楚这个相对琐碎的事情有点发疯,因为我敢肯定我只是在做一件令人难以置信的愚蠢的事情,但是任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

您是否尝试过将player用作成员var?因此,您可以在视图消失后(尚未进行测试)销毁它,但是代码应如下所示:

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)
        }
    }
}

答案 1 :(得分:0)

(对不起,我似乎无法发表评论)

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

相关问题