YouTube iFrame API “setPlaybackQuality” or “suggestedQuality” not working

后端 未结 6 953
温柔的废话
温柔的废话 2020-11-30 07:02

I\'m having some trouble setting the quality settings on a video via the Youtube iFrame API. This is my code:

var player;

player = new YT.Player(\'player\',         


        
相关标签:
6条回答
  • 2020-11-30 07:04

    Found a possible hack/solution.

    If I wait until the video has started playing, then apply setPlaybackQuality - it works. 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!
        }
    }
    

    However, the solution isn't ideal as the video first starts to buffer on a lower quality - then switch to 720 once it starts playing. Any comments or alternative solutions will be appreciated.

    0 讨论(0)
  • 2020-11-30 07:08

    I've played a little bit with this function and setPlaybackQuality in the onPlayerReady works. The only problem is that the assignment is not immediate, in fact getPlaybackQuality is returning the correct value just after the video is started. Actually before the video is started getPlaybackQuality will return always small. But one time the video starts is using the correct playBackQuality.

    I've also tried with different player size combinations and it even works.

    note: I'm using IFrame API.

    0 讨论(0)
  • 2020-11-30 07:12

    another solution, stop video and use seekTo(). for live streaming you can skip seekTo(). The bad it will show buffering but the good is you have full control no matter what the player size.

    var player = YT.get('videoid');
    rate = 'small';
    var currentTime = player.getCurrentTime();
    player.stopVideo();
    player.setPlaybackQuality(rate);
    player.playVideo();
    player.seekTo(currentTime, false);
    
    0 讨论(0)
  • 2020-11-30 07:14

    I have the exact same problem and workaround. I think what's happening is that YouTube is only allowing quality levels based on the actual size of the display, so unless you have your video 720px tall you can't default to 720p before it's actually playing. Then the user controls kick in and YouTube stops being a dick.


    EDIT

    Just hit a breakthrough: If you use event 3 (buffering) instead of event 5 (playing) there's no stutter for the user. Quality is changed as soon as it starts loading. Only weird thing is you need to set it in onPlayerReady as well or it doesn't work.

    function onPlayerReady(event) {
        event.target.setPlaybackQuality('hd720');
    }
    function onPlayerStateChange(event) {
        if (event.data == YT.PlayerState.BUFFERING) {
            event.target.setPlaybackQuality('hd720');
        }
    }
    
    0 讨论(0)
  • 2020-11-30 07:14

    Problem is YouTube selects the most appropriate playback quality, so it overrides setPlaybackQuality() in the onPlayerReady() function.

    I've found a solution to force YouTube's player to play in any quality you desire no matter the width and height of the player:

    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 );
        }
    }
    

    The code ensures the quality change is the suggested.

    Keep in mind: the user couldn't change the video quality with the player button with that code.

    Anyway, you could force the suggested quality just once.

    Tested in GChrome, Firefox, and Safari.

    0 讨论(0)
  • 2020-11-30 07:21

    i found a solution that works perfectly for me:

     function onPlayerStateChange(event) {
       //Some code...
    
       $(".btn-change-quality").on("click",  function(){
           pauseVideo();
           player.setPlaybackQuality('hd720');
           playVideo();
        });
    } 
    
    0 讨论(0)
提交回复
热议问题