YouTube iFrame API “setPlaybackQuality” or “suggestedQuality” not working
我在通过Youtube iFrame API设置视频质量设置时遇到了一些麻烦。 这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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(); } |
有趣的是,我对
我已经尝试了API参考中概述的所有有效字符串参数("中","大"," hd720"等)。 他们都不工作。
有人对我应该如何设置此属性有任何建议?
我有完全相同的问题和解决方法。
我认为发生的事情是YouTube仅允许根据显示的实际大小来确定质量水平,因此,除非您的视频高720像素,否则在播放之前不能默认为720p。然后,用户控制该按钮,YouTube不再是鸡巴。
编辑
刚刚取得突破:
如果您使用事件3(缓冲)而不是事件5(播放),则不会给用户造成停顿。质量开始加载后即会更改。唯一奇怪的是,您还需要在onPlayerReady中设置它,否则它将不起作用。
1 2 3 4 5 6 7 8 | function onPlayerReady(event) { event.target.setPlaybackQuality('hd720'); } function onPlayerStateChange(event) { if (event.data == YT.PlayerState.BUFFERING) { event.target.setPlaybackQuality('hd720'); } } |
找到了可能的破解/解决方案。
如果我等到视频开始播放,则应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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选择了最合适的播放质量,因此它会覆盖
我找到了一种解决方案,无论播放器的宽度和高度如何,都可以迫使YouTube的播放器以您想要的任何质量播放:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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中进行了测试。
我找到了一个最适合我的解决方案:
1 2 3 4 5 6 7 8 9 | function onPlayerStateChange(event) { //Some code... $(".btn-change-quality").on("click", function(){ pauseVideo(); player.setPlaybackQuality('hd720'); playVideo(); }); } |
另一种解决方案是停止视频并使用
1 2 3 4 5 6 7 | var player = YT.get('videoid'); rate = 'small'; var currentTime = player.getCurrentTime(); player.stopVideo(); player.setPlaybackQuality(rate); player.playVideo(); player.seekTo(currentTime, false); |
我已经使用了此功能,并且
唯一的问题是分配不是立即进行的,实际上
我也尝试过使用不同的播放器大小组合,甚至可以使用。
注意:
我正在使用IFrame API。