在AVPlayerViewController中如何获取scrubber拖动时的scrubbed预览时间?
在AVPlayerViewController中获取拖动进度条时的预览时间
在使用tvOS/iOS的AVPlayerViewController时,确实存在这样的限制:player.currentItem?.currentTime()只能获取视频播放中的当前时间,而用户拖动进度条(scrubber)时,系统UI会显示预览时间,但没有公开API能直接拿到这个值。如果想实现拖动时显示缩略图或元数据(类似YouTube、Apple TV应用的效果),同时保留AVPlayerViewController的内置功能,可参考以下几种思路:
一、公开API的变通方案
- iOS端手势识别+位置计算:
虽然AVPlayerViewController的进度条是私有视图,但可以尝试给控制器的view添加pan手势识别器,通过计算触摸点的位置来推导预览时间:- 遍历AVPlayerViewController的子视图,找到属于私有类
AVScrubber的进度条视图(仅遍历不调用私有方法,审核风险相对较低,但需注意系统版本更新可能导致视图结构变化)。 - 当pan手势触发时,计算触摸点在进度条上的相对比例,结合视频总时长
player.currentItem?.duration.seconds,算出对应的时间点。
缺点:tvOS上手势逻辑不同,该方法仅适用于iOS,且兼容性随系统版本变化。
- 遍历AVPlayerViewController的子视图,找到属于私有类
二、私有API(仅作了解,禁止用于上架应用)
Apple的AVPlayerViewController内部有私有属性可以监听拖动时的预览时间,比如_scrubber对象的scrubbingTime属性,示例代码如下:
// 仅作学习参考,上架App请勿使用 if let scrubber = avPlayerViewController.value(forKey: "_scrubber") as? NSObject { scrubber.addObserver(self, forKeyPath: "scrubbingTime", options: .new, context: nil) } // 在observeValue方法中获取值 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "scrubbingTime", let time = change?[.newKey] as? CMTime { // 这里拿到的time就是拖动时的预览时间 let seconds = CMTimeGetSeconds(time) print("预览时间:\(seconds)") } }
注意:使用私有API会直接导致App被App Store拒绝,仅适合内部测试或学习研究。
三、替代思路
如果无法获取精确的预览时间,可尝试以下折中方案:
- 提前解析视频的章节、字幕或自定义元数据,结合用户拖动的大致位置(通过手势比例计算),显示对应区间的元信息,精度虽有限但能满足部分场景需求。
- 若对功能完整性要求高于平台一致性,还是建议使用自定义播放器控件,完全掌控进度条的交互逻辑和时间获取。
目前Apple尚未提供获取该预览时间的公开API,你提交反馈的做法是对的,后续可关注iOS/tvOS的版本更新是否新增相关接口。
内容的提问来源于stack exchange,提问作者Valid Mohammadi
相关产品推荐
相关产品推荐

