代码之家  ›  专栏  ›  技术社区  ›  PGDev

在avplayerlayer和avplayerview控制器中同步视频

  •  3
  • PGDev  · 技术社区  · 7 年前

    我正在和 AVPlayer 使用 URL 在里面。它有两个部分:

    1。 首先,我嵌入了 玩家 到视图的子层,使用 AVPlayerLayer ,即

    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.第2条。 第二,关于 UIButton Tap,我正在演示 AVPlayerViewController 使用相同的 玩家 我之前创建的实例,即

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

    我现在面临的问题是, avplayerview控制器 打开,视频停止播放,但音频仍在播放。

    我想要的是 同步视频 在两者 AvPrimeLead avplayerview控制器 .

    1 回复  |  直到 7 年前
        1
  •  4
  •   Daniel Fernandez Y    7 年前

    我认为在共享已经创建到avplayerview控制器的播放器时存在问题。我不知道为什么要停止,但如果你为那个控制器创建一个新的avplayer,它就不会发生。同步播放器和AvPlayView控制器的方法如下:

    首先,您创建一个通知名称,当关闭avplayerview控制器时将使用该名称(Apple不提供一种方法来知道用户何时关闭avplayerview控制器):

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

    在您的视图控制器中,您可以观察到该通知,获取您想要的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()
            }
        }
    }
    

    缺点:它将发送每个avplayerview控制器的通知。当您需要此信息时,可以使用添加您作为观察者。希望能有所帮助。

    推荐文章