You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在AVPlayerViewController中如何获取scrubber拖动时的scrubbed预览时间?

在AVPlayerViewController中获取拖动进度条时的预览时间

在使用tvOS/iOS的AVPlayerViewController时,确实存在这样的限制:player.currentItem?.currentTime()只能获取视频播放中的当前时间,而用户拖动进度条(scrubber)时,系统UI会显示预览时间,但没有公开API能直接拿到这个值。如果想实现拖动时显示缩略图或元数据(类似YouTube、Apple TV应用的效果),同时保留AVPlayerViewController的内置功能,可参考以下几种思路:

一、公开API的变通方案

  • iOS端手势识别+位置计算:
    虽然AVPlayerViewController的进度条是私有视图,但可以尝试给控制器的view添加pan手势识别器,通过计算触摸点的位置来推导预览时间:
    1. 遍历AVPlayerViewController的子视图,找到属于私有类AVScrubber的进度条视图(仅遍历不调用私有方法,审核风险相对较低,但需注意系统版本更新可能导致视图结构变化)。
    2. 当pan手势触发时,计算触摸点在进度条上的相对比例,结合视频总时长player.currentItem?.duration.seconds,算出对应的时间点。
      缺点:tvOS上手势逻辑不同,该方法仅适用于iOS,且兼容性随系统版本变化。

二、私有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:23:27