Как заставить высококачественные миниатюры для YouTube Player API iframe встраиваться?


Миниатюры выглядели нормально в течение года, но внезапно стали размытыми. Миниатюра, которая появляется на странице загрузки, выглядит правильно, но в любое время новый эскиз отображается с помощью проигрывателя.cueVideoById', он выглядит очень размытым.

В документации нет упоминания о том, как контролировать качество миниатюр (доступны только настройки качества видео, такие как "setPlaybackQuality"). Документация: https://developers.google.com/youtube/iframe_api_reference

Как могу ли я принудительно создавать высококачественные миниатюры изображений?

1 9

1 ответ:

Да, этот вопрос легко воспроизводим. Я создалслегка измененную версию примера документации , он загружает видео и вызывает 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 задано (что бы это ни было) . Edit : на самом деле отладка кода показала, что a.j здесь не виноват. Вместо этого функция Av возвращает undefined при вызове чего-либо, кроме "default.jpg", поскольку структуры данных (в частности, b.La map) не полностью инициализированы. Для меня это просто выглядит как ошибка, и кажется, что это уже было сообщено в 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-плеера немного отличается и столь же непоследовательно.