如何解决“如果播放不开始,请尝试使用iPad上的Youtube iFrame API重新启动设备?

我创build了一个小的YouTubestream媒体脚本,可以随机播放YouTube音乐video或从队列中播放。 直到本周,它都运行良好,在使用iPad / iPhone时似乎并不想加载video。 我得到以下错误,而不是:

如果回放没有立即开始,请尝试重新启动您的设备

我试过了:

我试过Safari,Chrome,Firefox和Opera,它们都是错误的。 我已经尝试清除网站数据/caching,重新启动设备,充满重新启动设备。 没有任何工作 奇怪的是,它在Windows桌面上绝对正常,这使我相信这不是代码中的错误,而是随API或Safari改变的东西。 我的代码最近还没有被编辑,可能导致它停止工作。

我试过使用jsconsole.com进行debugging,没有任何可疑的popup。 在某些情况下,播放器将加载,video的标题将显示,图像也会显示,但是大约30秒后,上面的错误与加载微调器一起显示。

我知道playVideo(); 在iOS设备上不起作用(自动播放)。 这很好,再一次,脚本以前工作过,我只需要按第一个video播放。 但现在,似乎iOS正试图自动播放video。 所以,我也通过删除playVideo()调用进行testing,问题仍然存在。

在iPad 2,iPad mini和iPhone 4上进行testing(所有设备上都有最新的iOS版本,以前都是有效的)。

我很茫然,试图在周末前举办一场家庭派对:)所以,如果有什么可能导致iOS上的失败的帮助或提示,我将不胜感激。

这里是javascript代码:

// 2. This code loads the IFrame Player API code asynchronously. var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); // 3. This function creates an <iframe> (and YouTube player) // after the API code downloads. var player; function onYouTubeIframeAPIReady() { player = new YT.Player('player', { height: '390', width: '640', events: { 'onReady': onPlayerReady, 'onStateChange': onPlayerStateChange } }); } // 4. The API will call this function when the video player is ready. function onPlayerReady(event) { check_queue_timer = setTimeout(check_queue(),3000); } // 5. The API calls this function when the player's state changes. // The function indicates that when playing a video (state=1), // the player should play for six seconds and then stop. var done = false; function onPlayerStateChange(event) { if (event.data === 0) { // TRACK AS DONE, REFRESH QUEUE AND GET NEXT SONG // POST TO WRITE TO FILE $.ajax({ type: 'POST', url: site_url+'ajax_next_track', dataType: 'json', data: 'queue_id='+$('#queue_id').val(), cache: false, success: function(data){ if(data.status == 'success'){ $("#queue_table").empty(); if(data.queue.length == 0){ check_queue_timer = setTimeout(check_queue(),3000); } $.each(data.queue, function(i, item) { if(i == 0){ event.target.loadVideoById(item.video_id); event.target.playVideo(); $('#queue_id').val(item.queue_id); } $('#queue_table').append('<tr><td>'+item.title+'</td></tr>'); }); } else{ console(data.message); } }, error: function( jqXHR, textStatus, errorThrown ){ $('#error_msg').html('Something broke.').fadeIn(); } }); } } function stopVideo() { player.stopVideo(); } function check_queue(){ $.ajax({ type: 'POST', url: site_url+'ajax_next_track', dataType: 'json', data: 'no_delete=1', cache: false, success: function(data){ if(data.status == 'success'){ $("#queue_table").empty(); if(data.queue.length == 0){ clearTimeout(check_queue_timer); check_queue_timer = setTimeout(check_queue(),3000); } $.each(data.queue, function(i, item) { if(i == 0){ player.loadVideoById(item.video_id); player.playVideo(); $('#queue_id').val(item.queue_id); clearTimeout(check_queue_timer); } $('#queue_table').append('<tr><td>'+item.title+'</td></tr>'); }); } else{ console(data.message); } }, error: function( jqXHR, textStatus, errorThrown ){ $('#error_msg').html('Something broke.').fadeIn(); } }); } 

更新1(2015年11月25日)

我决定从头开始,并使用https://developers.google.com/youtube/iframe_api_reference上的示例代码。 看来,loadVideoById()不再适用于iPad。 这是之前。 如果我不包含loadVideoById()或playVideo(),它就会起作用。 理想情况下,我想它与loadVideoById()一起工作。

为了解决这个问题,我已经把我的头撞在了电脑上好几个小时…这就是我find的。

这是因为苹果严格的iOS限制而发生的:网页只有在直接回应用户反馈时才能开始播放audio/video。 (请注意,此限制仅影响首次在页面上播放audio/video。)

通常,为了解决Apple的限制,确保您的play()调用直接在事件处理程序(例如,点击处理程序)中发生就足够了。 这适用于Web Audio API和普通的HTML5video – 但YouTube播放器的某些function阻止了其在YouTube上的使用。

因此,YouTube的解决scheme显然是要求用户点击YouTubevideo本身来启动播放。 从此,您可以使用YouTube iframe API(播放,暂停,寻找等)来控制它。 但是,直到用户点击video ,您才能使用API​​控制YouTubevideo。

为了让用户体验到一个万无一失,您可以隐藏所有控制玩家的用户界面,并告诉用户点击YouTubevideo本身来开始播放。 然后,一次,用户点击了一次video,你可以激活你的用户界面。 当然,你应该devise这只适用于iOS。

谢谢你的头痛,苹果!

我有一个类似的问题,并做了一些挖掘,事实certificate,苹果已经删除了通过脚本等自动播放embedded项目的能力,所以最终用户不会意外地用完他们的数据。 用户需要自己触发播放button。

解决这个问题的最好方法是检查用户是否在手机或桌面上,并设置variables(true / false)。

这就是我所做的

 var mobileDevice = false; if(typeof window.orientation !== 'undefined'){ var mobileDevice = true; } if(!mobileDevice) ytPlayer.playVideo(); 

如果问题是其他两个答案(Adrian&Junior)说的话,那么通过访问UIWebView (或WKWebView )并设置mediaPlaybackRequiresUserAction标志可以轻松解决这个问题。 如果您推出自己的解决scheme或者使用官方框架( https://github.com/youtube/youtube-ios-player-helper ),则可以完成此操作。

迅速

 let playerView = YTPlayerView() playerView.webView.mediaPlaybackRequiresUserAction = false 

安装DPSaudio应用程序到我的笔记本电脑后,我遇到了问题。 这些应用程序将我现有的audio驱动程序修改为其“扬声器(数字电站)”audio设备。

通过阅读Redditpost,我将“audio设备”replace为“我的笔记本”的来源。 因此,这个问题解决了我。