API iFrame YouTube "setPlaybackQuality" или "предлагаемое качество" не работает

У меня возникли проблемы с настройкой параметров качества видео через API YouTube iFrame. Это мой код:

var player;

player = new YT.Player('player', {
    height: '490',
    width: '725',
    videoId: yturl,
    /* setPlaybackQuality: 'hd720', <-- DOES NOT WORK */
    /* suggestedQuality: 'hd720',   <-- DOES NOT WORK */
    events: {
        'onReady': onPlayerReady
    }
});

function onPlayerReady(event) {
    player.setPlaybackQuality('hd720');       // <-- DOES NOT WORK
    event.target.setPlaybackQuality('hd720'); // <-- DOES NOT WORK
    player.setVolume(100);                    // <-- DOES WORK
    console.log(player.getPlaybackQuality()); // <-- Prints 'small' to console
    event.target.playVideo();
}

Самое смешное, что мой призыв к player.setPlaybackQuality или же event.target.setPlaybackQuality не дает никаких ошибок. Это выглядит так, как будто игрок игнорирует это. Звонок, скажем, player.setSuggestedQuality (функция, которая не существует) выдает ошибку, как и ожидалось.

Я перепробовал все допустимые строковые параметры, как указано в справочнике по API ("средний", "большой", "hd720" и т. Д.). Никто из них не работает.

Кто-нибудь есть какие-либо предложения о том, как я должен установить это свойство?

6 ответов

Решение

У меня точно такая же проблема и обходной путь. Я думаю, что происходит то, что YouTube допускает только уровни качества, основанные на фактическом размере дисплея, поэтому, если у вас видео высотой 720px, вы не можете по умолчанию установить значение 720p, прежде чем оно действительно воспроизводится. Тогда пользователь контролирует удар, и YouTube перестает быть членом.


РЕДАКТИРОВАТЬ

Просто совершите прорыв: если вы используете событие 3 (буферизация) вместо события 5 (игра), то для пользователя нет заикания. Качество меняется, как только начинается загрузка. Единственное, что вам нужно, это установить его в onPlayerReady, иначе он не работает.

function onPlayerReady(event) {
    event.target.setPlaybackQuality('hd720');
}
function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.BUFFERING) {
        event.target.setPlaybackQuality('hd720');
    }
}

Нашел возможный взлом / решение.

Если я подожду, пока видео не начнет воспроизводиться, тогда я setPlaybackQuality - оно работает. Thusly:

player = new YT.Player('player', {
    height: '490',
    width: '725',
    videoId: yturl,
    events: {
        'onReady': onPlayerReady,
        'onStateChange': onPlayerStateChange
    }
});

function onPlayerReady(event) {
    player.setVolume(100);
    event.target.playVideo();
}

function onPlayerStateChange(event) {
    if (event.data == YT.PlayerState.PLAYING) {
        event.target.setPlaybackQuality('hd720');  // <-- WORKS!
    }
}

Однако решение не является идеальным, поскольку видео сначала начинает буферизоваться с более низким качеством, а затем переключается на 720, как только оно начинает воспроизводиться. Любые комментарии или альтернативные решения будут оценены.

Проблема в том, что YouTube выбирает наиболее подходящее качество воспроизведения, поэтому оно переопределяет setPlaybackQuality() в onPlayerReady() функция.

Я нашел решение заставить проигрыватель YouTube играть в любом качестве, которое вы пожелаете, независимо от ширины и высоты проигрывателя:

var player;
function onYouTubeIframeAPIReady() {
    player = new YT.Player('player', {
        height: '180',
        width: '320',
        videoId: 'M7lc1UVf-VE',
        events: {
        'onReady': onPlayerReady,
        'onPlaybackQualityChange': onPlayerPlaybackQualityChange,
        'onStateChange': onPlayerStateChange
        }
    });
}


function onPlayerReady(event) {
    event.target.playVideo();
}

function onPlayerPlaybackQualityChange(event) {
    var playbackQuality = event.target.getPlaybackQuality();
    var suggestedQuality = 'hd720';

    console.log("Quality changed to: " + playbackQuality );

    if( playbackQuality !== 'hd720') {
        console.log("Setting quality to " + suggestedQuality );
        event.target.setPlaybackQuality( suggestedQuality );
    }
}

Код гарантирует, что изменение качества будет предложено.

Имейте в виду: пользователь не может изменить качество видео с помощью кнопки проигрывателя с этим кодом.

Во всяком случае, вы можете форсировать предлагаемое качество только один раз.

Протестировано в GChrome, Firefox и Safari.

Я нашел решение, которое идеально подходит для меня:

 function onPlayerStateChange(event) {
   //Some code...

   $(".btn-change-quality").on("click",  function(){
       pauseVideo();
       player.setPlaybackQuality('hd720');
       playVideo();
    });
} 

Я немного поиграл с этой функцией и setPlaybackQuality в onPlayerReady работает. Единственная проблема заключается в том, что назначение не является немедленным, на самом деле getPlaybackQuality возвращает правильное значение сразу после запуска видео. На самом деле до запуска видео getPlaybackQuality вернется всегда small, Но один раз, когда начинается видео, используется правильный playBackQuality.

Я также пробовал с разными комбинациями размеров игроков, и это даже работает.

примечание: я использую IFrame API.

Другое решение, остановите видео и используйте seekTo(), для прямой трансляции вы можете пропустить seekTo(), Плохо это будет показывать буферизацию, но хорошо, что у вас есть полный контроль независимо от размера игрока.

var player = YT.get('videoid');
rate = 'small';
var currentTime = player.getCurrentTime();
player.stopVideo();
player.setPlaybackQuality(rate);
player.playVideo();
player.seekTo(currentTime, false);
Другие вопросы по тегам