【问题标题】:YouTube Android API seekToMillis() not working accuratelyYouTube Android API seekToMillis() 无法正常工作
【发布时间】:2015-03-28 12:34:20
【问题描述】:

使用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 播放器从精确的开始时间开始播放视频,如果可能的话,精确到毫秒。

【问题讨论】:

  • 我认为这就是 YouTube 自己做的,你无法改变。
  • 是的。但不可能是 youtube 开发人员错过了一个如此明显的错误。我想应该有办法摆脱它。

标签: android android-youtube-api


【解决方案1】:

这不是错误,这是可搜索压缩视频文件的标准行为

简短而超简单的解释

一个压缩的视频文件是由一系列帧组成的。帧有两种宏类型,全帧 (F) 和部分帧 (p*):
  • 全帧:包含特定时间的完整真实帧(如完整的 JPEG 图像)
  • 部分帧只是相对于前一帧的一组差异,通常表示为运动矢量。

原始视频序列:

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)

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

这正是您遇到的问题:您正在寻找 到映射在部分帧上的特定时间,因此您需要返回 到最近的全帧,然后从那里开始播放。

在 YouTube 这样的流媒体环境中,问题更加困难,因为标题可以使用例如快进方法来欺骗此限制。

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

【讨论】:

  • 如果我从 YouTube 获取高质量视频而不是低质量视频(这是我不做的),这个问题是否仍然可能持续存在?或者说有没有其他办法解决这个问题?
  • @HarishMohanan 我不确定 YouTube 如何处理各种格式的视频,但我可以假设质量较低的版本可能比较高质量的版本具有更少的关键帧。你可以试试;)
猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 2016-12-03
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 2014-01-16
相关资源
最近更新 更多