Я почесываю голову над несоответствиями на YouTube, добавляя качество воспроизведения на мобильные устройства.
Я использую iframe api и создал демонстрацию для демонстрации кода:
https://ancientoffbeatrotation - five-nine.repl.co/
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>repl.it</title>
<link href="index.css" rel="stylesheet" type="text/css" />
</head>
<body>
<script src="index.js"></script>
<iframe id="ytplayer" type="text/html" style="position:absolute; top:0px; left:0px; bottom:0px; right:10px; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;" src="https://www.youtube-nocookie.com/embed/_r3LynEZuko?playlist=_r3LynEZuko&rel=0&autoplay=1&playsinline=1&controls=0&showinfo=0&enablejsapi=1" frameborder="0" allowfullscreen></iframe>
</body>
</html>
JS
var tag = document.createElement('script');
tag.src = "//www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('ytplayer', {
events: {
'onReady': onPlayerReady,
'onPlaybackQualityChange': onPlayerPlaybackQualityChange,
'onStateChange': onPlayerStateChange
}
});
}
function onPlayerReady() {
player.playVideo();
player.mute();
}
function onPlayerPlaybackQualityChange(event) {
var available_qualities = player.getAvailableQualityLevels();
alert("Available qualities are" + available_qualities);
var displayed_quality= player.getPlaybackQuality();
alert("Used quality is" + displayed_quality);
}
function onPlayerStateChange(event) {
if(event.data === YT.PlayerState.PLAYING){
event.target.setSize( width=7000, height=10000 ); //huge dimensions
}
}
Примечание : я использовал repl.it вместо jsfiddle или codenpen, потому что два последних используют iframe, поэтому он изменяет / изменяет пиксели, доступные для iframe youtube, что может сделать наши наблюдения неверными. Вместо этого repl.it не использует iframe и развертывает настоящую HTML-страницу, поэтому мы можем больше доверять ей в этом эксперименте.
Теоретически
Youtube заявляет, что будет использовать высоту видео для установки разрешения (даже если оно может изменить его в зависимости от других факторов, само по себе оно может определять скорость соединения ...):
В списке ниже приведены уровни качества воспроизведения, которые соответствуют
разные стандартные размеры плеера. Мы рекомендуем вам установить высоту
вашего видео проигрывателя к одному из значений, перечисленных ниже, и что вы
Увеличьте размер вашего проигрывателя, чтобы использовать соотношение сторон 16: 9.
Как указано выше, даже если
вы выбираете стандартный размер проигрывателя, мы также рекомендуем вам установить
предлагаемое значение параметра Качества по умолчанию, чтобы включить YouTube
выберите наиболее подходящее качество воспроизведения.
маленький: рост игрока
240px, а размеры игрока не менее 320px на 240px для 4: 3
соотношение сторон. средний: высота игрока 360px, размеры игрока
640 на 360 пикселей (для формата 16: 9) или 480 на 360 пикселей (для 4: 3)
соотношение сторон).
большой: высота игрока 480px, а размеры игрока
853 на 480 пикселей (для формата 16: 9) или 640 на 480 пикселей (для 4: 3)
соотношение сторон).
hd720: высота игрока составляет 720 пикселей, а размеры игрока
1280 на 720 пикселей (для формата 16: 9) или 960 на 720 пикселей (для 4: 3)
соотношение сторон).
hd1080: высота проигрывателя составляет 1080 пикселей, а размеры проигрывателя
1920 на 1080 пикселей (для формата 16: 9) или 1440 на 1080 пикселей (для
Соотношение сторон 4: 3).
highres: высота игрока больше 1080px,
это означает, что соотношение сторон плеера больше, чем 1920px на
1080px. по умолчанию: YouTube выбирает подходящее качество воспроизведения.
Этот параметр эффективно восстанавливает уровень качества по умолчанию
состояние и сводит на нет все предыдущие попытки установить качество воспроизведения, используя
функции cueVideoById, loadVideoById или setPlaybackQuality.
Я настаиваю на том, что я не использую в демонстрационном коде метод setPlaybackquality, который не работал вообще в течение последних нескольких месяцев, даже если он все еще недокументирован (см. здесь или здесь ), так что дело не в я думаю, что проблема метода setPlaybackQuality.
На практике: суть ошибки
Я просто устанавливаю размер с помощью setSize (), и YouTube соответственно меняет разрешение видео. И я наблюдаю, что изменение его на рабочем столе прекрасно работает в соответствии с этой таблицей, предоставленной Google . но на мобильных устройствах это похоже на работу ... до определенного момента это похоже на "потолок", разрешение, максимально допустимое для Youtube, основанное на неизвестных и очень странных (см. мои эксперименты ниже) критериях для меня , который ограничивает разрешение, которое может быть установлено. На моем iphone 7 он всегда ограничен "HD720". На моем Huawei Android P SMart он всегда ограничен "Large". Так что я не понимаю: я имею в виду сверхбыстрый Wi-Fi дома, даже если я не могу получить огромные размеры демо-видео (высота> 5000 пикселей) HD 1080, и у меня всегда максимальный уровень HD720.
Вот демонстрация, чтобы поделиться моими выводами: https://ancientoffbeatrotation - five-nine.repl.co/
Обратите внимание, что все тесты выполняются на самом последнем Chrome (> = 64); Safari на ios ведет себя так же в моих экспериментах.
на большом хромированном рабочем столе 1800 x 945 я получаю видео на YouTube с разрешением hd 1080 (максимально круто): идеально, как и ожидалось
chrome dev tools> эмулировать iphone7, поэтому он принимает размеры 375px x 667px => используется 1080hd, идеально, как и ожидалось
затем на реальном iphone 7 или в браузере (служба для использования реальных устройств в облаке): здесь используется разрешение hd720, несмотря на огромные размеры видео, которые должны обеспечивать загрузку в формате hd1080 . Прямо здесь проблема.
Контекст: очень хорошее соединение Wi-Fi, полный заряд батареи (нет режима низкого заряда батареи, который может добавить ограничения на загрузку мультимедиа)
Та же проблема с моим телефоном Android, когда он даже не доходит до hd720 и установлен на «большой».
Еще одно «захватывающее» наблюдение: я решил добавить в код предупреждение, чтобы узнать, какое именно, какое качество доступно, тайна углубляется
function onPlayerPlaybackQualityChange(event) {
var available_qualities = player.getAvailableQualityLevels();
alert("Available qualities are" + available_qualities);
}
И тайна проясняется, но снова зависит от других :( как показано ниже:
на рабочем столе: я прочитал для этого предупреждения "Доступны следующие качества: hd1080 , hd720, большой, средний, крошечный, автоматический"
=> так что в приведенных выше наблюдениях я получил действительно максимально возможное качество, которое хорошо, учитывая размеры видео
на реальном iphone 7: я прочитал для этого предупреждения "Доступные качества: hd720 , средний, маленький, авто"
Поэтому я подумал, хаха, поэтому я получаю HD720, может быть, так как это максимально доступно. Но почему? у меня очень высокая скорость соединения и мой телефон довольно современный (iphone 7).
но загадка углубляется, потому что с вышеприведенным наблюдением на iphone 7 я подумал: «Хорошо, по крайней мере, теперь я понимаю немного больше, я получил самое высокое доступное разрешение, просто hd720 был максимальным доступным для некоторых причина ", но тайна углубляется, когда я тестирую на своем Huawei P Smart: здесь я читаю по предупреждению" доступные качества: hd1080 , hd720, большой, средний, маленький, крошечный, авто ", поэтому я бы ожидайте получить самое высокое разрешение HD1080 ... но нет, я получаю ... "большой" (даже не HD720!). Так что моя теория рушится. Плюс, с какой стати iphone 7 получил бы доступное качество hd720 как самое высокое разрешение и huawei P Smart hd1080 (примечание: когда я проверял разрешение экрана телефона, он сказал: 2160 x 1080)
Я подумал, что, может быть, как и некоторые люди, упоминаемые в прессе, мой интернет-оператор (бесплатный мобильный во Франции) делает то же самое с трейлингом verizon или t-mobile в США для youtube, но я пробовал с различными прокси в мире и наблюдения всегда одинаковы. поэтому проблема скорее всего не связана с этим.
Я супер потерянный здесь, у кого-нибудь есть идея, что происходит?