youtube iframe播放器不会自动在低带宽的移动质量切换

使用iOS 9.3,链接条件设置为3G速度,在Safari浏览器中加载YouTube上的iframe apivideo。

我期望的iframe api认识到,它已经caching了一堆,并尝试获得较低的质量stream,以保持video播放的stream畅,就像在本地的YouTube应用程序。

我错过了什么明显的? 我基本上复制并粘贴了youtube ios helper wrapper,但它仍然尝试播放质量过高的连接速度。

<!DOCTYPE html> <html> <head> <style> body { margin: 0; width:100%; height:100%; background-color:#000000; } html { width:100%; height:100%; background-color:#000000; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100% !important; height: 100% !important; } </style> </head> <body> <div class="embed-container"> <div id="player"></div> </div> <script src="https://www.youtube.com/iframe_api" onerror="window.location.href='ytplayer://onYouTubeIframeAPIFailedToLoad'"></script> <script> var player; var error = false; YT.ready(function() { player = new YT.Player('player', { "events" : { "onPlaybackQualityChange" : "onPlaybackQualityChange", "onReady" : "onReady", "onError" : "onPlayerError", "onStateChange" : "onStateChange" }, "width" : "100%", "height" : "100%", "videoId" : 'NP7nK2zPirc', "playerVars" : { "showinfo" : 0, "modestbranding" : 1, "autohide" : 1, "playsinline" : 1, "controls" : 0 } }); player.setSize(window.innerWidth, window.innerHeight); window.location.href = 'ytplayer://onYouTubeIframeAPIReady'; // this will transmit playTime frequently while playng function getCurrentTime() { var state = player.getPlayerState(); if (state == YT.PlayerState.PLAYING) { time = player.getCurrentTime() // window.location.href = 'ytplayer://onPlayTime?data=' + time; } } window.setInterval(getCurrentTime, 500); }); function onReady(event) { // window.location.href = 'ytplayer://onReady?data=' + event.data; } function onStateChange(event) { if (!error) { // window.location.href = 'ytplayer://onStateChange?data=' + event.data; } else { error = false; } } function onPlaybackQualityChange(event) { // window.location.href = 'ytplayer://onPlaybackQualityChange?data=' + event.data; } function onPlayerError(event) { if (event.data == 100) { error = true; } // window.location.href = 'ytplayer://onError?data=' + event.data; } window.onresize = function() { player.setSize(window.innerWidth, window.innerHeight); } </script> </body> </html> 

根据此文档 ,如果回放质量发生变化, onPlaybackQualityChange事件将触发,并且您的代码应该响应该事件,而不是调用setPlaybackQuality函数。

video播放质量发生变化时, onPlaybackQualityChange事件将触发。 例如,如果您调用setPlaybackQuality(suggestedQuality)函数,则该事件将在播放质量实际发生变化时触发。 您的应用程序应该对事件做出响应,并且不应当在setPlaybackQuality(suggestedQuality)函数时自动更改质量。 同样,您的代码不应该假定回放质量只会因为明确地调用setPlaybackQuality或任何其他允许您设置build议回放质量的函数而发生变化。

然后我build议调用getAvailableQualityLevels()函数来确定哪些质量级别可用于video。 例如,如果您的网页显示hd720video播放器,则hd720质量的video实际上会比hd1080质量的videohd1080

检查这些相关的SO线程:

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

如果您使用事件3(缓冲)而不是事件5(正在播放),则用户不会出现口吃。 一旦开始加载,质量就会改变。 唯一奇怪的是你需要在onPlayerReady中设置它,否则它不起作用。

 function onPlayerReady(event) { event.target.setPlaybackQuality('hd720'); } function onPlayerStateChange(event) { if (event.data == YT.PlayerState.BUFFERING) { event.target.setPlaybackQuality('hd720'); } } 
  • 设置jw播放器的YouTubevideo播放质量

希望这可以帮助!