gpt4 book ai didi

ios - 使用NotificationCenter在AVPlayer中替换视频文件

转载 作者:行者123 更新时间:2023-11-30 12:48:50 24 4
gpt4 key购买 nike

我正在努力在 Swift 中实现一个视频播放器,它将检测视频是否停止播放,然后播放第二个视频。当第二个视频停止播放时,第一个视频应再次播放。

这是我设置播放器、 Assets 和播放器项目的位置:

    //Create URLs
let movieOneURL: URL = URL(fileURLWithPath: movieOnePath)
let movieTwoURL: URL = URL(fileURLWithPath: movieTwoPath)

//Create Assets
let assetOne = AVAsset(url: movieOneURL)
let assetTwo = AVAsset(url: movieTwoURL)

//Create Player Items
avPlayerItemOne = AVPlayerItem(asset: assetOne)
avPlayerItemTwo = AVPlayerItem(asset: assetTwo)

avplayer = AVPlayer(playerItem: avPlayerItemOne)
let avPlayerLayer = AVPlayerLayer(player: avplayer)
avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
avPlayerLayer.frame = UIScreen.main.bounds
movieView.layer.addSublayer(avPlayerLayer)

//Config player
avplayer .seek(to: kCMTimeZero)
avplayer.volume = 0.0

在这里,我设置了一个通知来检测播放器是否到达视频文件的末尾:

    NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemDidReachEnd), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: avplayer.currentItem)

...调用此选择器:

    func playerItemDidReachEnd(_ notification: Notification) {
// avplayer.seek(to: kCMTimeZero)
changePlayerAsset()
// avplayer.play()
}

...然后将切换 Assets :

func changePlayerAsset(){
if avplayer.currentItem == avPlayerItemOne {
avplayer.replaceCurrentItem(with: avPlayerItemTwo)
avplayer.play()

} else if avplayer.currentItem == avPlayerItemTwo {
avplayer.replaceCurrentItem(with: avPlayerItemOne)
avplayer.play()
}
}

这在第一次时效果很好 - 当第一部电影播放完毕后,下一个电影就会开始播放。

我遇到的问题是我的通知观察者似乎只注册一次;在第一个视频结束时...当第二个视频完全停止播放时,不会触发通知。

任何人都知道为什么会出现这种情况

最佳答案

你的通知处理程序没有被第二个项目调用的原因是这个位,在你注册通知处理程序的末尾:object: avplayer.currentItem。当该项目完成播放时,处理程序被调用一次,但当下一个项目完成时,通知将通过不同的对象(另一个项目)发布,这不会'与您注册的内容不匹配,因此您的处理程序不会被调用。如果您在注册处理程序时将 object 更改为 nil,那么当任何项完成时都会调用它,这更接近您的情况再之后。

也就是说,这并不是实现您想要的效果的好方法 - 手动交换项目可能会产生每次要玩时加载每个项目的成本和延迟。您最好使用内置功能来按顺序播放视频并循环播放视频,即 AVQueuePlayer 和 AVPlayerLooper。 this question 的答案中有一个如何使用两者的示例.

关于ios - 使用NotificationCenter在AVPlayer中替换视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41271737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com