YouTube iFrame API“setPlaybackQuality”或“suggestedQuality”无效

时间:2012-01-10 11:24:18

标签: javascript api iframe youtube

通过Youtube iFrame API在视频上设置质量设置时遇到了一些问题。这是我的代码:

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.setPlaybackQualityevent.target.setPlaybackQuality的来电没有任何错误。它看起来好像玩家忽略了它。例如,调用player.setSuggestedQuality(不存在的函数)会按预期抛出错误。

我已经尝试了所有有效的字符串参数outlined in the API reference('medium','large','hd720'等)。他们都没有工作。

任何人对我应该如何设置此属性有任何建议?

6 个答案:

答案 0 :(得分:28)

我有完全相同的问题和解决方法。 我认为正在发生的事情是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');
    }
}

答案 1 :(得分:4)

找到可能的黑客/解决方案。

如果我等到视频开始播放,请应用setPlaybackQuality - 它有效。正是如此:

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。任何意见或替代解决方案将不胜感激。

答案 2 :(得分:3)

问题是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中测试。

答案 3 :(得分:2)

我找到了一个适合我的解决方案:

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

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

答案 4 :(得分:0)

我已经使用此功能进行了一些操作,setPlaybackQuality中的onPlayerReady正常工作。 唯一的问题是赋值不是立即的,实际上getPlaybackQuality在视频启动后返回正确的值。实际上,在视频开始之前getPlaybackQuality将始终返回small。但有一次视频开始使用正确的 playBackQuality

我也尝试过不同的播放器尺寸组合,甚至可以使用。

请注意: 我正在使用 IFrame API

答案 5 :(得分:0)

另一种解决方案,停止视频并使用seekTo()。对于直播,您可以跳过seekTo()。不好的是它会显示缓冲,但好的是你可以完全控制,无论玩家的大小。

var player = YT.get('videoid');
rate = 'small';
var currentTime = player.getCurrentTime();
player.stopVideo();
player.setPlaybackQuality(rate);
player.playVideo();
player.seekTo(currentTime, false);