簡體   English   中英

在AVPlayerLayer和AVPlayerViewController中同步視頻

[英]Sync video in AVPlayerLayer and AVPlayerViewController

我正在使用AVPlayer來顯示播放視頻,其中包含一個URL 它有兩個部分:

1.首先,我使用AVPlayerLayerAVPlayer嵌入到視圖的子層中,即

var player: AVPlayer?

func configure() {
    let urlString = "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"
    if let url = URL(string: urlString) {
        self.player = AVPlayer(url: url)
        let playerLayer = AVPlayerLayer(player: self.player)
        playerLayer.frame = self.view.bounds
        self.view.layer.addSublayer(playerLayer)
        player.play()
    }
}

上面的代碼工作正常,視頻正在播放。

2.其次,在UIButton tap上,我使用我之前創建的相同AVPlayer實例呈現AVPlayerViewController ,即

@IBAction func onTapVideoButton(_ sender: UIButton) {
    self.player?.pause()
    let controller = AVPlayerViewController()
    controller.player = self.player
    self.present(controller, animated: true) {
        self.player?.play()

    }
}

我面臨的問題是,在AVPlayerViewController打開后,視頻停止播放但音頻仍在播放。

我想要的是同步 AVPlayerLayerAVPlayerViewController 的視頻

我認為將已經創建的播放器共享到AVPlayerViewController時會出現問題。 我不知道為什么要停止,但如果你為該控制器創建一個新的AVPlayer,它就不會發生。 同步播放器和AVPlayerViewController的方法可能是這樣的:

首先,您創建一個通知名稱,當AVPlayerViewController被解雇時您將使用該通知名稱(蘋果不會讓您知道用戶何時解雇AVPlayerViewController):

extension Notification.Name {
    static let avPlayerDidDismiss = Notification.Name("avPlayerDidDismiss")
}

然后,您將擴展AVPlayerViewController以在要解除時發布此通知並發送用戶離開視頻的時間:

extension AVPlayerViewController {

    open override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        if let seekTime = player?.currentTime() {
            let userInfo = ["seekTime": seekTime]
            NotificationCenter.default.post(name: .avPlayerDidDismiss, object: nil, userInfo: userInfo)
        }
    }

}

在ViewController中,您可以觀察到該通知,獲取您想要的seekTime並使用它來設置您的avPlayer:

class ViewController: UIViewController {
    var player: AVPlayer?

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        configure()
        NotificationCenter.default.addObserver(self, selector: #selector(avPlayerDidDismiss), name: .avPlayerDidDismiss, object: nil)
    }

    func configure() {
        self.player = getPlayer()
        let playerLayer = AVPlayerLayer(player: self.player)
        playerLayer.frame = self.view.bounds
        self.view.layer.addSublayer(playerLayer)
        self.player?.play()
    }

    @IBAction func onTapVideoButton(_ sender: UIButton) {
        self.player?.pause()
        let controllerPlayer = getPlayer()
        controllerPlayer.currentItem?.seek(to: self.player!.currentTime(), completionHandler: nil)
        let controller = AVPlayerViewController()
        controller.player = controllerPlayer
        self.present(controller, animated: true, completion: {
            controller.player?.play()
        })
    }

    func getPlayer() -> AVPlayer {
        let url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")!
        return AVPlayer(url: url)
    }

    @objc
    private func avPlayerDidDismiss(_ notification: Notification) {
        if let seekTime = notification.userInfo?["seekTime"] as? CMTime {
            player?.currentItem?.seek(to: seekTime, completionHandler: nil)
            player?.play()
        }
    }
}

缺點:它將為每個AVPlayerViewController發送通知。 您需要在需要此信息時將您添加為觀察者。 希望它可以提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM