YouTube iFrame API"setPlaybackQuality"或"suggestedQuality"无效

o01*_*o01 22 javascript youtube api iframe

我通过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();
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,我的呼吁player.setPlaybackQualityevent.target.setPlaybackQuality没有给出任何错误.它看起来好像玩家忽略了它.例如,对player.setSuggestedQuality(不存在的函数)的调用会按预期引发错误.

我已经尝试了API参考中所述的所有有效字符串参数('medium','large','hd720'等).他们都没有工作.

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

小智 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不再起作用(2018 年 4 月)。我发布了一个 [使用 css 的解决方法](/sf/answers/3485843161/) 来欺骗 YouTube 加载更高质量的视频。绝对没有这个解决方案那么优雅,所以我希望他们将来能修复 setPlaybackQuality。 (2认同)
  • 对于几年后发现此问题的人来说,setPlaybackQuality 函数不再受支持。查看 2019 年 10 月 24 日的修订历史记录:https://developers.google.com/youtube/iframe_api_reference#october-24,-2019 (2认同)

o01*_*o01 5

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

如果我等到视频开始播放,那么申请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!
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,解决方案并不理想,因为视频首先开始以较低质量缓冲 - 然后在开始播放时切换到720.任何意见或替代解决方案将不胜感激.