使用AVPlayerItem的cancelPendingSeeks()方法解决问题。该方法用于取消任何挂起的seek请求,并结束seek操作。示例代码如下:
// 在播放器初始化时添加通知观察者
NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd(notification:)), name: .AVPlayerItemDidPlayToEndTime, object: nil)
player.currentItem?.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.new], context: nil)
// 拖动进度条时取消挂起的seek操作
func seek(to time: CMTime, completionHandler: ((Bool) -> Void)?) {
player.currentItem?.cancelPendingSeeks()
player.seek(to: time, toleranceBefore: CMTime.zero, toleranceAfter: CMTime.zero, completionHandler: completionHandler)
}
// 播放到结尾时重新播放
@objc func playerItemDidReachEnd(notification: Notification) {
player.seek(to: CMTime.zero)
}
在这个示例中,我们添加了两个通知观察者,一个是在播放到结尾时重新播放,一个是在观察AVPlayerItem的状态以便在需要时取消挂起的seek操作。在用户拖动进度条时,我们使用cancelPendingSeeks()方法来取消任何挂起的seek请求,并在完成seek操作后调用传入的completionHandler回调函数。