Как заставить высококачественные миниатюры для 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.Lamap) не полностью инициализированы. Для меня это просто выглядит как ошибка, и кажется, что это уже было сообщено в 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.