Как заставить высококачественные миниатюры для YouTube Player API iframe встраиваться?
Миниатюры выглядели нормально в течение года, но внезапно стали размытыми. Миниатюра, которая появляется на странице загрузки, выглядит правильно, но в любое время новый эскиз отображается с помощью проигрывателя.cueVideoById', он выглядит очень размытым.
В документации нет упоминания о том, как контролировать качество миниатюр (доступны только настройки качества видео, такие как "setPlaybackQuality"). Документация: https://developers.google.com/youtube/iframe_api_reference
Как могу ли я принудительно создавать высококачественные миниатюры изображений?
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
,предположительно потому, что. Edit : на самом деле отладка кода показала, чтоa.j
задано (что бы это ни было)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) }
Обратите внимание, что приведенный выше текст относится только к проигрывателю HTML5. Поведение Flash-плеера немного отличается и столь же непоследовательно.
Mt(a.videoId, b)
вернул бы правильный URL, но функция возвращаетc
вместо значенияundefined
.