如何为YouTube Player API iframe嵌入高质量缩略图?

时间:2014-11-22 00:39:41

标签: javascript youtube-javascript-api video-thumbnails

缩略图看上去好一年多了,但突然变得模糊了。 页面加载上显示的缩略图看起来是正确的,但只要使用“player.cueVideoById”显示新缩略图,它就会显得非常模糊。

文档中没有提及如何控制缩略图质量(仅限视频质量设置,例如'setPlaybackQuality'可用)。文档:https://developers.google.com/youtube/iframe_api_reference

如何强制使用高质量的缩略图?

1 个答案:

答案 0 :(得分:13)

是的,这个问题很容易重现。我创建了slightly modified version of the documentation example,它会加载视频并稍后调用setPlaybackQuality。可以清楚地看到质量下降。实际上,原始缩略图为https://i.ytimg.com/vi/M7lc1UVf-VE/sddefault.jpg,正在被https://i1.ytimg.com/vi/M7lc1UVf-VE/default.jpg替换。

虽然Flash播放器非常不透明,但对于HTML5播放器,我们可以看一下(非常混淆)source code。这段代码特别有趣(为了便于阅读而重新格式化):

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不是罪魁祸首。相反,Av函数在调用除undefined以外的任何内容时返回"default.jpg",因为数据结构(特别是b.La映射)未完全初始化。对我来说,这看起来就像一个bug,它似乎已经是reported to 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)会返回正确的网址,但该函数会返回c,而不是undefined

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