YouTube Android API seekToMillis() 无法正常工作

YouTube Android API seekToMillis() not working accurately

使用youtubePlayer.seekToMillis()函数时,有2秒的寻道延迟。不完全是 2 秒,但大致如此。就像您尝试寻找 10,000 毫秒到 12,000 毫秒之间的任何位置(例如:11,000 11,500、11,550)。该视频将从 10,000 本身开始。如果您给出的值介于 12,000 和 14,000 之间,它将转到 12,000 点..等等...

我们正在开发一款应用程序,其中 YouTube 必须从指定的准确时间开始。因此这个功能对我们来说非常重要。

youtubePlayer.seekToMillis(10000);
youtubePlayer.play();

请告诉我们一些提示,告诉我们如何使用 YouTube 播放器从精确的开始时间开始播放视频,如果可能的话精确到毫秒。

这不是错误,这是 seekable-compressed 视频文件的标准行为

简短super-simplified解释

压缩视频文件由一系列帧组成。有两个macro-types帧,完整帧F)和部分帧( p*):

  • 全帧:包含特定时间的完整真实帧(如完整的 JPEG 图像)
  • 部分帧只是相对于前一帧的一组差异,通常表示为运动向量。

原始视频序列:

F F F F F F F F F F F F F F F F F F F ... (eof)

压缩视频序列:

F p p p p F p p p p F p p p p p F p p ... (eof)

这样的压缩结构允许创建更小的文件(因为部分帧小于完整帧),但也引入了一个愚蠢的问题:无法直接从部分帧开始播放,因为为了正确解码,您需要执行 ascend直到第一个全帧

This is exactly the problem you are experiencing: you are seeking to a specific time which is mapped on a partial frame, so you need to go back to the nearest full frame and start the playback from there.

在像 YouTube 这样的 streming 上下文中,问题更加困难,因为 header 可以使用例如快进方法来绕过此限制。

如上所述,这是一个非常简化的解释。您可以找到更多信息 here.