【问题标题】:One AVPlayer's AVPlayerItemDidPlayToEndTime action executed for all Currently playing videos为所有当前正在播放的视频执行一个 AVPlayer 的 AVPlayerItemDidPlayToEndTime 操作
【发布时间】:2018-08-30 09:30:21
【问题描述】:

问题:在有播放器的 collectionview 单元格中

如果我同时播放两个视频并寻找第一个视频结束然后AVPlayerItemDidPlayToEndTime 触发两次并且两个视频都重新启动

在我的集合视图单元格中

override func awakeFromNib() {
        NotificationCenter.default.addObserver(forName: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player?.currentItem, queue: .main, using: {[weak self]  (notification) in
            if self?.player != nil {
                self?.player?.seek(to: kCMTimeZero)
                self?.player?.play()
            }
        })
   }

还有一个播放视频的按钮操作。
在单元格中,我有滑块要寻找。

任何帮助将不胜感激

【问题讨论】:

  • 是否应该删除观察者以实现单元可重用性?
  • 我没有那样做。 gif 是我没有滚动页面的前两个单元格。 @Sandeep
  • 我在按钮操作上启动 avplayer 有问题吗? @Sandeep
  • 我认为这不是问题。无论如何,您都会在某些用户操作上对其进行初始化。您真的需要能够同时播放两个视频吗?
  • @Sandeep 我认为的解决方案是检查关闭时间,如果它没有结束,那么我不会将时间重置为 0

标签: ios swift avplayer


【解决方案1】:

在注册通知时,请确保 playerplayer?.currentItem 不等于 nil。对我来说,其中一个似乎是 nil,而您基本上订阅了所有 .AVPlayerItemDidPlayToEndTime 通知(因为 object 是 nil)。

为避免这种情况,请在将AVAsset 分配给播放器后立即订阅通知。

【讨论】:

  • 非常感谢。是的,这就是问题所在。如果 AVPlayer Item 为 nil,那么所有 AVPlayer 都会触发通知!
  • 这里有一些关于这个实现的好代码stackoverflow.com/a/36911168/480415
  • @RyanG 谢谢,但您共享的链接是用于在 userInfo 中传递数据。这不是这里的情况。这里我们需要将player.currentItem 传递给对象参数,以便仅订阅来自该项目的通知。
  • @nevos 正确,但它提供了如何设置它的基础。我发布了一个关于如何处理的更具体代码的答案
【解决方案2】:

斯威夫特 5.1

将项目作为您的对象传递:

// Stored property
let player = AVPlayer(url: videoUrl)

// When you are adding your video layer
let playerLayer = AVPlayerLayer(player: player)
NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem)

// add layer to view 

然后,当您收到该通知时,您可以通过以下方式获得currentItem

// Grab the item from the notification object and ensure its the same item as the current players item
if let item = notification.object as? AVPlayerItem,
    let currentItem = player.currentItem,
    item == currentItem {

    NotificationCenter.default.removeObserver(self, name: .AVPlayerItemDidPlayToEndTime, object: nil)

    // remove player from view or do whatever you need to do here
}     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多