【发布时间】: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.asyncAfter1 秒后调用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