如何在使用多个AVPlayer时检测哪个视频播放结束?
区分触发播放结束通知的AVPlayer实例
这个问题我做双视频播放功能时也碰到过,核心是要让通知回调能精准关联到对应的播放实例,给你两种简单靠谱的解决思路:
方法1:为每个AVPlayerItem单独绑定通知观察者
你之前用object: nil会监听所有AVPlayerItem的结束通知,改成给每个player的currentItem单独添加观察者,就能精准区分来源:
// 假设你已经初始化了两个AVPlayer实例:player1和player2 if let item1 = player1.currentItem { NotificationCenter.default.addObserver( self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: item1 ) } if let item2 = player2.currentItem { NotificationCenter.default.addObserver( self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: item2 ) }
然后在回调方法里,通过notification.object拿到触发通知的AVPlayerItem,再判断它属于哪个player:
@objc func playerDidFinishPlaying(_ notification: Notification) { guard let finishedItem = notification.object as? AVPlayerItem else { return } if finishedItem == player1.currentItem { // 这里处理player1播放结束的逻辑 print("Player 1 播放完成") } else if finishedItem == player2.currentItem { // 这里处理player2播放结束的逻辑 print("Player 2 播放完成") } }
方法2:给AVPlayerItem添加自定义标识
如果不想单独绑定观察者,也可以给每个AVPlayerItem设置一个唯一标识,用KVC给item加个自定义key:
// 初始化player时给对应的item设置标识 player1.currentItem?.setValue("player_1", forKey: "customPlayerId") player2.currentItem?.setValue("player_2", forKey: "customPlayerId")
然后在回调里读取这个标识来区分:
@objc func playerDidFinishPlaying(_ notification: Notification) { guard let finishedItem = notification.object as? AVPlayerItem, let playerId = finishedItem.value(forKey: "customPlayerId") as? String else { return } switch playerId { case "player_1": print("Player 1 播放结束") case "player_2": print("Player 2 播放结束") default: break } }
注意事项
别忘了在页面销毁时移除观察者,避免内存泄漏:
deinit { NotificationCenter.default.removeObserver(self) }
内容的提问来源于stack exchange,提问作者Shahrukh Malik
相关产品推荐
相关产品推荐

