2015-11-24 41 views
9

Ho creato un piccolo script di streaming di YouTube che riproduce in modo casuale video musicali di YouTube o da una coda. Ha funzionato bene per mesi fino a questa settimana in cui non sembra voler caricare i video quando si utilizza un iPad/iPhone. Ottengo il seguente errore invece:Come risolvere "Se la riproduzione non inizia tra poco, prova a riavviare il dispositivo" usando l'API iFrame di YouTube su iPad?

Se la riproduzione non inizia poco, prova a riavviare il dispositivo

Quello che ho provato:

Ho provato Safari, Chrome , Firefox e Opera e tutti loro errore. Ho provato a cancellare i dati del sito/cache, riavviare il dispositivo, facendo il pieno riavvio del dispositivo. Niente funziona. La cosa strana è che funziona perfettamente su un desktop Windows che mi porta a credere che non sia un errore nel codice, ma qualcosa che è cambiato con l'API o con Safari. Il mio codice non è stato modificato di recente o potrebbe aver causato il suo arresto.

Ho provato a debuggarlo utilizzando jsconsole.com, non compare nulla di sospetto. In alcuni casi, verrà caricato il player, verrà visualizzato il titolo del video e così sarà l'immagine, ma dopo circa 30 secondi, l'errore sopra riportato verrà visualizzato insieme allo spinner di caricamento.

Sono consapevole del fatto che playVideo(); non funziona (riproduzione automatica) su dispositivi iOS. Questo va bene, e ancora una volta, la sceneggiatura ha funzionato in precedenza, ho solo dovuto premere play sul video primo. Ma ora, sembra che iOS stia cercando di riprodurre automaticamente il video. Così, ho anche provato rimuovendo le chiamate playVideo(), il problema persiste ancora.

Testato su iPad 2, iPad mini e iPhone 4 (tutti con l'ultimo iOS disponibile sul dispositivo e tutti funzionanti in precedenza).

Sono in perdita e sto cercando di farlo riparare prima del fine settimana per una festa in casa :) Quindi apprezzerei qualsiasi aiuto o suggerimento su cosa potrebbe causare l'errore su iOS.

ecco il codice 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(); 
     } 

    }); 
} 

UPDATE 1 (25 novembre 2015)

ho deciso di ripartire da zero e lavorare con il codice di esempio su https://developers.google.com/youtube/iframe_api_reference. Sembra che loadVideoById() non funzioni più su iPad. Era prima. Se non includo loadVideoById() o playVideo() funziona. Idealmente, mi piacerebbe che funzionasse con loadVideoById().

+0

Mi è successo oggi, tutti i video non funzionano su tutti i browser youtube e fb. – XBasic3000

risposta

5

ho sbattuto la testa contro il computer per ore cercando di risolvere questo ... Ecco quello che ho trovato.

Questo sta accadendo a causa della limitazione draconiana iOS di Apple: le pagine Web possono solo iniziare a riprodurre audio/video quando rispondono direttamente al feedback degli utenti. (Si noti questa limitazione riguarda solo la prima volta audio/video viene riprodotto in una pagina.)

Di solito, per aggirare la limitazione di Apple, è sufficiente assicurarsi che chiamate il vostro gioco() avviene direttamente in un gestore di eventi (ad esempio, un gestore di clic). Funziona per l'API Web Audio e i normali video HTML5, ma qualcosa sul player di YouTube impedisce a questo di funzionare su YouTube.

Di conseguenza, la soluzione per YouTube a quanto pare è richiedere all'utente di fare clic sul video di YouTube stesso per avviare la riproduzione. Da quel momento, puoi controllarlo usando l'API iframe di YouTube (riproduzione, pausa, ricerca, ecc.). Ma non puoi controllare il video di YouTube utilizzando l'API fino al dopo l' l'utente ha fatto clic sul video.

Per un'esperienza utente infallibile, puoi nascondere tutta l'interfaccia utente di controllo giocatore e dire agli utenti di fare clic sul video YouTube stesso per avviare la riproduzione. Quindi, una volta, l'utente ha fatto clic sul video una volta, è possibile attivare l'interfaccia utente. Ovviamente, dovresti progettarlo solo per applicarlo a iOS.

Grazie per il mal di testa, Apple!

4

Avevo un problema simile e ho fatto alcuni scavi, risulta che Apple ha rimosso la possibilità di riprodurre automaticamente gli elementi incorporati tramite script ecc. In modo che l'utente finale non utilizzi in modo imprevisto i propri dati. L'utente deve attivare automaticamente il pulsante di riproduzione.

Il modo migliore per risolvere questo problema è controllare se l'utente è su cellulare o desktop e impostare una variabile (vero/falso).

Questo è quello che ho fatto

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

 
if(!mobileDevice) ytPlayer.playVideo();

Speriamo che aiuta.

Source (https://developer.apple.com)

Per evitare download non richiesti attraverso le reti cellulari a spese dell'utente, i media incorporati non possono essere riprodotti automaticamente in Safari su iOS -l'utente avvia sempre la riproduzione.

Più risposte qui - YouTube API not working with iPad/iPhone/non-Flash device

1

Se il problema è quello che altre due risposte (Adrian & Junior) dicono allora dovrebbe essere facilmente risolto mediante l'accesso alla UIWebView (o WKWebView) e impostando il flag mediaPlaybackRequiresUserAction. Questo può essere fatto se hai lanciato la tua soluzione o se utilizzi il framework ufficiale (https://github.com/youtube/youtube-ios-player-helper).

Swift

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

ho affrontato il problema dopo l'installazione di un'applicazione audio DPS al mio portatile. Le app hanno modificato il mio driver audio esistente nei loro dispositivi audio "Altoparlanti (Digital Power Station)".

Leggendo un post Reddit, sostituisco l'origine del dispositivo audio all'origine del mio portatile. Quindi, il problema è stato risolto per me.