Как правильно показывать несколько видео в одном avPlayerLayer - PullRequest
0 голосов
/ 20 июня 2020

Чего я пытаюсь достичь?

Я показываю пользователям подпредставление со встроенным контролем страницы. Я хочу показать три разных видео в одном подвиде.

Как я реализовал 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()

Второй шаг (когда пользователь нажимает кнопку «Далее» и когда я Я пытаюсь показать другое видео в одном и том же подвиде):

    @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 - у моего видео другое выравнивание (в основном уже не посередине).

Подсказки? Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Прежде всего, создайте новый AvPlayerItem.

var playerItem:AVPlayerItem?

Затем используйте функцию replaceCurrentItem.

playerItem = AVPlayerItem(url: theURL!)
avPlayer.replaceCurrentItem(with: playerItem)

Вот и все. Теперь вы можете повторно использовать существующий avPlayer.

0 голосов
/ 20 июня 2020

Вместо добавления нового подвида с 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()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...