2012-11-08 3 views
7

Sto riscontrando alcuni problemi nel far funzionare un embed di YouTube.YouTube embed su iPad: buffer per sempre quando si avvia tramite l'API Javascript

Sto utilizzando l'API di YouTube per caricare il video. In cima al video caricato ho un controllo personalizzato <div> (trasparente) con solo un pulsante di riproduzione (uno <img>). In questo modo si nasconde il player YouTube predefinito dietro un pulsante di riproduzione che si abbina al resto del design sul sito.

Il <div> sovrappone l'intero iFrame caricato, in modo che il giocatore in sé non è cliccabile - io uso un evento click sul <div> per avviare il video invece:

// Inside onYouTubePlayerAPIReady(): 
var player = new YT.Player(playerId, { 
    height: height, 
    width: '100%', 
    videoId: videoId, 
    playerVars: { 
    html5: '1', 
    controls: '0', 
    rel: '0', 
    showinfo: '0', 
    modestbranding: '1', 
    theme: 'light', 
    color: 'white', 
    wmode: 'transparent', 
    suggestedQuality: "large" 
    } 
}); 

$(".youtube-player-controls").bind("click", function(e){ 
    if (!player || !player.getPlayerState) return false; 
    if (player.getPlayerState() == YT.PlayerState.PLAYING) player.pauseVideo(); 
    else player.playVideo(); 
    return false; 
}); 

funziona bene su iPhone, ma su iPad (e anche Android sembra) il video passa al primo fotogramma del video, ma poi si blocca allo stato di buffering (controllato tramite player.getPlayerState()).

Ho provato ad avviare il video con player.loadVideoById() che non funziona (errore uguale).

Se rimuovo i controlli di sovrapposizione <div> e quindi consente all'utente di fare effettivamente clic sul video, funziona correttamente.

Qualche suggerimento su come posso riprodurre il video utilizzando l'API di Javascript?

Edit:

ho cambiato il codice embed un po ', vale a dire ho aggiunto la html5=1 come descritto in Force HTML5 youtube video. Questo cambia il contenuto dell'iFrame incorporato per usare il player HTML5, ma non risolve il problema.

Ho provato a vedere se poteva funzionare come descritto in http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html.

+1

troppo mi sembra di riscontrare questo problema pure. Il video continua a caricarsi per sempre su iPad e persino iPhone 4. – mr1031011

+0

Per me funziona effettivamente come previsto su iPhone 4. Non sono stato in grado di testare iPhone 5. – Woodgnome

+0

Ho lo stesso problema. Nel mio caso non sembra essere correlato alla sovrapposizione sui controlli, perché il mio pulsante è dietro il video. Il video si carica, inizia a bufferizzare e si blocca sullo schermo nero. –

risposta

0

Apple non consente il caricamento di tag tramite script su iOS (per evitare l'utilizzo di larghezza di banda non necessaria su reti mobili). Diverse versioni di Android mostrano lo stesso comportamento.

Dovrai far sì che l'utente inizi il video facendo clic sul video stesso, dopodiché sarai in grado di controllare il video tramite l'API come sui dispositivi desktop.

+0

Questo si applica solo al precarico/autoplay come descritto in http://developer.apple.com/library/safari/# documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html e può essere aggirato utilizzando l'evento Javascript onclick. Questo, tuttavia, è descritto per l'incorporamento audio/video HTML5, quindi potrebbe non essere applicato interamente agli incorporamenti di YouTube (non dimenticare, qualcosa * fa * si verifica quando si fa clic sul pulsante di riproduzione personalizzato). – Woodgnome

+0

Mentre è vero per i tag HTML5

-1

Attualmente eseguiamo solo un controllo prima di inviare player.playVideo(); funzione. Non è l'ideale, ma funziona finché non otteniamo una migliore correzione a livello di API da parte di Google.

Nella parte superiore dello script embed si imposta il var:

var isiPad = navigator.userAgent.match(/iPad/i) != null; 

Poi nella funzione click si utilizza:

if (!isiPad) { 
player.playVideo(); 
} 
+1

Non riprodurre il video non è più una soluzione. – mikemaccana

+0

@mikemaccana la soluzione è indirizzare un evento diverso verso l'ipad. Pertanto, nel nostro caso, abbiamo consentito all'evento click di rimuovere la cornice del poster e avviare il video tramite JS per i browser supportati. Per cose come gli iPad dovremmo semplicemente rimuovere la cornice del poster al clic e l'utente farebbe di nuovo clic per avviare il video. Non è certamente perfetto ma funziona. – btburton42

+0

@jabberlope Non sono un grande fan del rilevamento dei dispositivi. Inoltre, sto vedendo questo su diversi dispositivi mobili (iPad 3rd Gen, iPod 5th Gen, Moto X). C'è un modo per rilevare se la funzione playVideo() o la parte che non funziona correttamente è supportata? 'if (! CanPlayViaJS) { player.playVideo(); } ' –