提问者:小点点

如何在同一个avPlayerLayer中正确显示多个视频


我想要达到的目标?

我正在向用户展示一个带有集成页面控件的子视图。 我想在同一个子视图上展示三个不同的视频。

我是如何实现AVPlayer的?

第一步:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    avPlayerLayer.frame = (WelcomeView?.video.layer.bounds)!
}

第一个视频与以下代码片段完美地对齐在我的视野中间:

WelcomeView?.frame.size.width = deviceScreen.frame.size.width
WelcomeView?.frame.size.height = deviceScreen.frame.size.height
WelcomeView?.video.layer.cornerRadius = 15
WelcomeView?.video.clipsToBounds = true
WelcomeView?.gradient.layer.cornerRadius = 25
WelcomeView?.gradient.clipsToBounds = true
WelcomeView?.label.addShadow()
let theURL = Bundle.main.url(forResource:"welcome1", withExtension: "MP4")
avPlayer = AVPlayer(url: theURL!)
avPlayerLayer = AVPlayerLayer(player: avPlayer)
avPlayerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
avPlayer.volume = 0
avPlayer.actionAtItemEnd = .none
NotificationCenter.default.addObserver(self,
selector: #selector(playerItemDidReachEnd(notification:)),
name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
object: avPlayer.currentItem)
WelcomeView?.video.frame = (WelcomeView?.video.layer.bounds)!
WelcomeView?.video.layer.insertSublayer(self.avPlayerLayer, at: 0)
WelcomeView?.tapNext.addTarget(self, action: #selector(GalleryViewController.nextOutboarding(sender:)))
self.view.addSubview(WelcomeView!)
avPlayer.play()

第二步(当用户点击next按钮,当我尝试在同一子视图上显示不同的视频时):

    @objc func nextOutboarding(sender: UITapGestureRecognizer) {
    WelcomeView?.pageControl.currentPage += 1
    
    if WelcomeView?.pageControl.currentPage == 1 {
        avPlayer.pause()
        avPlayerLayer.removeFromSuperlayer()
        let theURL = Bundle.main.url(forResource:"welcome2", withExtension: "MP4")
        avPlayer = AVPlayer(url: theURL!)
        avPlayerLayer = AVPlayerLayer(player: avPlayer)
        avPlayerLayer.videoGravity = AVLayerVideoGravity.resizeAspect
        avPlayer.volume = 0
        avPlayer.actionAtItemEnd = .none
        NotificationCenter.default.addObserver(self,
        selector: #selector(playerItemDidReachEnd(notification:)),
        name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,
        object: avPlayer.currentItem)
        WelcomeView?.video.frame = (WelcomeView?.video.layer.bounds)!
        WelcomeView?.video.layer.insertSublayer(self.avPlayerLayer, at: 0)
        self.view.addSubview(WelcomeView!)
        avPlayer.play()
    }
}

我的问题:

当我尝试在同一个avPlayerLayer上显示第二个视频时--我的视频有不同的对齐方式(基本上不再是中间了)。

有什么提示吗? 谢谢。


共1个答案

匿名用户

不是每次用户单击next时都使用AvPlayerLayer添加新的子视图,而是应该重用已经添加的AvPlayerLayer来播放下一个视频。 在您的代码中,您试图再次添加WelcomeView作为子视图,但它已经是一个子视图,并且上一层具有您为它设置的所有属性,您不需要重复该操作。

@objc func nextOutboarding(sender: UITapGestureRecognizer) {
    WelcomeView?.pageControl.currentPage += 1

    if WelcomeView?.pageControl.currentPage == 1 {
        avPlayer.pause()
        let theURL = Bundle.main.url(forResource:"welcome2", withExtension: "MP4")
        avPlayer = AVPlayer(url: theURL!)
        avPlayerLayer = AVPlayerLayer(player: avPlayer)
        avPlayer.play()
    }
}