如何强制YouTube播放器API iframe嵌入的高质量缩略图?

9
缩略图一直很好,但突然变得模糊了。页面加载时显示的缩略图看起来正确,但每当使用“player.cueVideoById”显示新缩略图时,它都非常模糊。
文档中没有提到如何控制缩略图质量(仅提供视频质量设置,例如“setPlaybackQuality”)。文档链接:https://developers.google.com/youtube/iframe_api_reference 我该如何强制高质量缩略图?
1个回答

13
是的,这个问题很容易重现。我创建了一个稍微修改过的文档示例,它加载了一个视频并在一秒钟后调用setPlaybackQuality。很明显质量会降低。事实上,原始缩略图是https://i.ytimg.com/vi/M7lc1UVf-VE/sddefault.jpg,被替换为https://i1.ytimg.com/vi/M7lc1UVf-VE/default.jpg
虽然Flash播放器相当不透明,但对于HTML5播放器,我们可以查看(相当混淆的)源代码。这段代码特别有趣(为了可读性重新格式化):
var c;
if (!a.j)
{
  var d = a.element.clientWidth,
      e=a.element.clientHeight;
  if (900 < d || 600 < e)
    c = Av(b, "maxresdefault.jpg");
  !c && (430 < d||320 < e) && (c = Av(b, "sddefault.jpg"))
}
c || (c = Av(b, "default.jpg"));

这意味着您确实不应该控制缩略图的质量,而应根据视口大小进行设置。如果宽度超过900或高度超过600,则会获取maxresdefault.jpg,如果宽度超过430或高度超过320,则会获取sddefault.jpg,在所有其他情况下,您将获得default.jpg。这确实像这样工作-对于初始加载。这似乎是预期的行为。
然而,对于player.cueVideoById(),您并没有得到这个结果-那里总是default.jpg可能是因为设置了a.j(无论那是什么)编辑:实际上,调试代码显示,a.j不是这里的罪魁祸首。相反,当为除"default.jpg"以外的任何内容调用Av函数时,b.La映射(特别是)数据结构未完全初始化,因此返回undefined。对我来说,这只是一个bug,而且似乎已经向Google 报告了。
供参考,函数Av的源代码:
function Av(a,b)
{
  if (30 == a.O)
  {
    // This branch isn't being entered
    var c = a.La["default.jpg"];
    return c?c:a.videoId?de("//docs.google.com/vt",{id:a.videoId,authuser:a.Wa,authkey:a.Kb}):"//docs.google.com/images/doclist/cleardot.gif"
  }
  b || (b="hqdefault.jpg");
  return (c = a.La[b]) || "sddefault.jpg" == b || "maxresdefault.jpg" == b ?
    c :
    Mt(a.videoId, b)
}

Mt(a.videoId, b)会返回正确的URL,但是该函数返回c,意味着undefined

请注意,上述文本仅适用于HTML5播放器。Flash播放器的行为略有不同,同样不一致。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接