YouTube iFrame API“setPlaybackQuality”或“suggestedQuality”不起作用

IT技术 javascript api iframe youtube
2021-02-26 02:53:23

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

我已经尝试了 API 参考中概述的所有有效字符串参数(“中”、“大”、“hd720”等)。他们都没有工作。

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

6个回答

我有完全相同的问题和解决方法。我认为正在发生的事情是 YouTube 只允许基于显示器的实际大小的质量级别,所以除非你的视频高 720 像素,否则你不能在实际播放之前默认为 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');
    }
}
ios模拟器总是使用 medium
2021-04-21 02:53:23
那是 2012 年,当时它正在工作,但它不适用于 iOS 12
2021-05-11 02:53:23
这似乎不再起作用(2018 年 4 月)。我发布了一个使用 css来欺骗 YouTube 加载更高质量视频解决方法绝对没有这个解决方案那么优雅,所以我希望他们将来能修复 setPlaybackQuality。
2021-05-13 02:53:23
为我工作!嘿,您认为这是因为 init 视频必须具有相同的播放质量吗?我真的很感兴趣为什么 onPlayerStateChange() 还不够?
2021-05-15 02:53:23
对于几年后发现此问题的任何人,不再支持 setPlaybackQuality 函数。查看 2019 年 10 月 24 日的修订历史:developers.google.com/youtube/...
2021-05-20 02:53:23

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

如果我等到视频开始播放,然后应用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。任何意见或替代解决方案将不胜感激。

我用 UIWebView 和 WKWebView 尝试过,但它不起作用!
2021-05-04 02:53:23
仅当播放器尺寸至少为 720 像素高度时,这才有效。
2021-05-08 02:53:23

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

“player.getplaybackquality()”在应该是 hd720 时返回 hd1080?为什么是这样?谢谢
2021-04-25 02:53:23
你能用 iOS 应用程序和它的 WKWebView 测试它吗?
2021-05-09 02:53:23

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

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

   $(".btn-change-quality").on("click",  function(){
       pauseVideo();
       player.setPlaybackQuality('hd720');
       playVideo();
    });
} 
那对我有用。另外,我添加了变量first_play = false并将 onclick 代码放入 if 语句 ( if( ! first_play )) 中。然后只需在 if 语句中添加 first_play = true,即可完美运行
2021-05-21 02:53:23

我在这个功能和工作setPlaybackQuality玩了一点onPlayerReady唯一的问题是分配不是立即的,实际上getPlaybackQuality是在视频开始后立即返回正确的值。实际上在视频开始之前getPlaybackQuality总是会返回small但是有一次视频开始时使用了正确的playBackQuality

我也尝试过不同的播放器尺寸组合,它甚至有效。

注意:我正在使用IFrame API

如果视频不支持,显然不可能设置回放质量。
2021-04-30 02:53:23