【问题标题】:How can I get current time from YouTube-ios-player-helper on swift?如何在 swift 上从 YouTube-ios-player-helper 获取当前时间?
【发布时间】:2021-06-15 14:15:13
【问题描述】:

我尝试使用来自 swiftUI 的 YouTube-ios-player-helper 从 YouTube 获取当前时间。 有currentTime() 方法可以调用当前时间。但是,每当我调用这个函数时,它都会返回void 值,当我检查currentTime() 函数时,它的返回类型实际上是void。 我认为返回值应该具有当前时间值,而不应该是无效值。我想知道这是错误设计的功能还是其他原因。当我尝试从 YouTube 播放器获取当前时间时,您能告诉我这里出了什么问题吗?

下面是我的快速代码

struct YTWrapper : UIViewRepresentable {

@Binding var videoID : String
@Binding var seconds : Float

@State var playerView = YTPlayerView()

func makeUIView(context: Context) -> YTPlayerView {
    playerView.load(withVideoId: videoID,
                    playerVars: ["playsinline": 1])
    
    return playerView
}

func updateUIView(_ uiView: YTPlayerView, context: Context) {
    
    playerView.seek(toSeconds: seconds, allowSeekAhead: true)
    
    
    @State var temp : Void

    NSLog("current Time:")
    temp = playerView.currentTime()
    print(temp)
    NSLog("end")
}

}

下面是结果

2021-06-15 20:05:12.086348+0800 Meerkat[3141:795444] current Time:
()
2021-06-15 20:05:12.086446+0800 Meerkat[3141:795444] end

以下是 YouTube-ios-player-helper 的 currentTime 函数

/**
 * Returns the elapsed time in seconds since the video started playing. This
 * method corresponds to the JavaScript API defined here:
 *   https://developers.google.com/youtube/iframe_api_reference#getCurrentTime
 *
 * @param completionHandler async callback block that contains float number with the result or an error.
 */
- (void)currentTime:(_Nullable YTFloatCompletionHandler)completionHandler;

- (void)currentTime:(_Nullable YTFloatCompletionHandler)completionHandler {
  [self evaluateJavaScript:@"player.getCurrentTime();"
         completionHandler:^(id  _Nullable result, NSError * _Nullable error) {
    if (!completionHandler) {
      return;
    }
    if (error) {
      completionHandler(-1, error);
      return;
    }
    if (!result || ![result isKindOfClass:[NSNumber class]]) {
      completionHandler(0, nil);
      return;
    }
    completionHandler([result floatValue], nil);
  }];
}

【问题讨论】:

  • currentTime 函数返回 void 但有一个完成块将给出值,正如您从您共享的 Objective-c 代码(来自 Youtube 助手)中看到的那样。
  • @ChanpreetSingh 你能详细说明一下吗?你的意思是 '- (void)currentTime:(_Nullable YTFloatCompletionHandler)completionHandler {...}' 这部分?由于我不熟悉objective-c 代码,所以我不太了解YouTube 助手中的代码。您能否解释一下如何使用您提到的完成块来获取当前时间?为了获取当前时间,我应该从“playerView.currentTime()”传递一些参数,比如“playerView.currentTime(something)”吗?

标签: swift current-time


【解决方案1】:

您可以通过以下两种方式实现这一目标。 第一个是使用 currentTime 完成处理程序。

ytPlayerView.currentTime { time, error in
    guard let err = error else{
       debugPrint("Elapsed Time:\(time)")
       return
    }
    debugPrint("Error :\(err)")
}

我在上面评估 js 时遇到了问题(youtube 助手库问题,可能需要一些更新)。如果它对您有用,请尝试一下。

第二个是将代理分配给玩家ytPlayerView.delegate = self,并使用预定义的代理功能。

func playerView(_ playerView: YTPlayerView, didPlayTime playTime: Float){
      debugPrint("Elapsed Time:\(playTime)")
}

【讨论】:

  • 明白了!在第一个,我在视频开始时遇到了 javascript 错误。但是播放视频后我没有收到任何错误。我也可以通过打印时间值来获取当前时间。真的感谢 ! *还尝试通过研究如何使用委托来应用第二种方法。但是我现在无法应用它,因为我不完全了解如何使用它。
  • 谢谢,但您绝对应该阅读并尝试代理,因为在 iOS 开发中您会经常使用它。
  • 当然!我会再次尝试学习。谢谢 ! :)
猜你喜欢
  • 2020-01-12
  • 2017-08-15
  • 1970-01-01
  • 2015-09-16
  • 2016-10-14
  • 2014-07-08
  • 2016-09-06
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多