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

SwiftUI中使用YouTubePlayerKit实现视频回退n秒功能

实现YouTubePlayerKit视频回退指定秒数

要实现点击按钮将视频回退指定秒数的功能,核心是通过getCurrentTime()异步获取当前播放进度,计算目标时间后调用seek(to:allowSeekAhead:)完成跳转。具体实现如下:

关键步骤

  • 定义回退时长常量,按需调整数值;
  • 在按钮点击事件中异步获取当前播放时间;
  • 处理获取结果:成功则计算目标时间(当前时间-回退秒数,确保不小于0),调用seek跳转;失败则处理错误。

修改后的完整代码

import SwiftUI
import YouTubePlayerKit

struct ContentView: View {
    // 设定回退秒数,可自行修改
    let backSeconds: Double = 10
    
    let youTubePlayer = YouTubePlayer(
        source: .url("https://www.youtube.com/watch?v=qL-ry_tz6V0"),
        configuration: .init(
            autoPlay: true
        )
    )

    @State private var jumpTo: Double = 27

    var body: some View { 
        ZStack {
            YouTubePlayerView(self.youTubePlayer) { state in
                switch state {
                case .idle:
                    ProgressView()
                case .ready:
                    EmptyView()
                case .error(let error):
                    Text(verbatim: "YouTube player couldn't be loaded: \(error.localizedDescription)")
                }
            }
            HStack {
                Button("PLAY") {
                    youTubePlayer.play()
                }
                Button("PAUSE") {
                    youTubePlayer.pause()
                }
                Button("STOP") {
                    youTubePlayer.stop()
                }
                Button("SEEK") {
                    youTubePlayer.seek(to: jumpTo, allowSeekAhead: true)
                }
                // 新增回退按钮
                Button("BACKWARD \(Int(backSeconds))s") {
                    youTubePlayer.getCurrentTime { result in
                        switch result {
                        case .success(let currentTime):
                            // 确保目标时间不小于0,避免跳转异常
                            let targetTime = max(currentTime - backSeconds, 0)
                            // 跳转到目标位置并继续播放
                            youTubePlayer.seek(to: targetTime, allowSeekAhead: true)
                            youTubePlayer.play()
                        case .failure(let error):
                            print("获取当前播放时间失败: \(error)")
                        }
                    }
                }
            }
            .offset(y: 250)
            .padding()
            .background(Color.black.opacity(0.5))
            .foregroundColor(.white)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

注意事项

  • getCurrentTime是异步方法,必须在回调闭包内处理结果,无法同步获取值;
  • 用max(_:_:)限制目标时间最小值为0,防止出现负数导致跳转错误;
  • 跳转后调用play()可让视频从目标位置继续播放,若需保持暂停状态可移除该调用;
  • 错误处理可根据需求扩展,比如替换打印日志为UI提示。

内容的提问来源于stack exchange,提问作者Uzr66

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:05:23