2016-03-02 25 views
7

Ho riscontrato problemi con i video che utilizzano Chrome.Cerco in video HTML5 con Chrome

Per qualche ragione, non importa quello che faccio, video.seekable.end(0) è sempre 0.

Quando chiamo video.currentTime = 5, seguito da console.log(video.currentTime), vedo che è sempre 0, che sembra ripristinare il video.

Ho provato entrambi i formati webm MP4 e VP9, ​​ma entrambi hanno dato gli stessi risultati.

La cosa più fastidiosa è che Firefox funziona perfettamente. C'è qualcosa di speciale su Chrome che dovrei sapere?

Ecco il mio codice (che funziona solo in Firefox):

 <div class="myvideo"> 
     <video width="500" height="300" id="video1" preload="auto"> 
      <source src="data/video1.webm" type="video/webm"/> 
      Your browser does not support videos. 
     </video> 
     </div> 

Ed ecco la javascript:

var videoDiv = $(".myvideo").children().get(0) 
videoDiv.load(); 
    videoDiv.addEventListener("loadeddata", function(){ 
    console.log("loaded"); 
    console.log(videoDiv.seekable.end(0)); //Why is this always 0 in Chrome, but not Firefox? 
    videoDiv.currentTime = 5; 
    console.log(videoDiv.currentTime); //Why is this also always 0 in Chrome, but not Firefox? 
    }); 

noti che semplicemente chiamando videoDiv.play() viene effettivamente riprodotta correttamente il video in entrambi i browser.

Inoltre, dopo che il file del film è stato caricato completamente, lo videoDiv.buffered.end(0) fornisce anche i valori corretti in entrambi i browser.

risposta

12

Mi c'è voluto un po 'per capirlo ...

Il problema si è rivelata sul lato server. Stavo usando una versione di Jetty per servire tutti i miei file video. La semplice configurazione di Jetty non supportava byte serving.

La differenza tra Firefox e Chrome è che Firefox scaricherà l'intero file video in modo da poterlo cercare, anche se il server non supporta http code 206 (partial content). Chrome, d'altra parte, rifiuta di scaricare l'intero file (a meno che non sia molto piccolo, come circa 2-3mb).

Quindi, per ottenere il parametro currentTime di video HTML5 di lavorare in Chrome, è necessario un server che supporta il codice http 206.

Per chiunque altro abbia questo problema, è possibile raddoppiare controllare la configurazione del server con l'arricciatura:

curl -H Range:bytes=16- -I http://localhost:8080/GOPR0001.mp4 

Ciò dovrebbe restituire codice 206. Se restituisce il codice codice 200, Chrome non sarà in grado di cercare il video, ma Firefox lo farà, a causa di una soluzione alternativa nel browser.

E un ultimo consiglio: È possibile utilizzare NPM http-server per ottenere un semplice http-server per una cartella locale che supporta i contenuti parziali:

npm install http-server -g 

ed eseguirlo per servire una cartella locale:

http-server -p 8000 
+0

Ho un problema simile, ma solo su Mac. Chrome si rifiuta di cercare, ma Firefox funziona. Sono in esecuzione un server compatibile con http 206 sulla mia macchina e posso vedere le 206 richieste nel registro di rete. Forse dovrei fare una nuova domanda su SO per questo. –

+0

Stai dicendo che dobbiamo semplicemente inviare il codice di ritorno come 206 affinché la funzione di ricerca funzioni in Chrome? – vbNewbie

+0

No, sto dicendo che 206 è un modo per verificare che il contenuto parziale possa essere recuperato da un server. Se stai scrivendo il tuo server, devi essere conforme al protocollo. Chrome utilizza queste informazioni per non dover scaricare l'intero video prima di eseguirne lo streaming. È efficiente – Tovi7

0

Hai 3 possibilità per il tag Video: MP4, OGG, WebM.

Non tutti i formati funzionano su tutti i browser.

Qui, penso che WebM funzioni in Firefox ma non in Chrome, quindi è necessario fornire entrambi i formati alternativi per i file MP4 e WebM, includendo un tag 2nd Source che si riferisce al file MP4.

E.g. src = "data/video1.mp4" type = "video/mp4"

La versione pertinente verrà automaticamente selezionata dal browser.

+0

Come menzionato nella domanda, in realtà ho provato a utilizzare mp4 in chrome e non ha fatto alcuna differenza. Inoltre, mi sorprenderebbe che Webm non funzionasse in Chrome, dal momento che Google è la principale forza trainante dell'intero formato. – Tovi7

+0

Ci scusiamo - hai ragione su entrambi i fronti - dovrei prima leggere la domanda - e sì, Chrome dovrebbe sicuramente occuparsi di WebM. Sembra che Ian Devlin abbia la risposta corretta. Come rapido, ho avuto problemi con i file MP4 che non sono in formato H264 ... –

0

Ho avuto un problema simile. Stavo ascoltando un evento finale su un video e impostando la durata corrente al centro del video per eseguirne il loop continuo. Non funzionava in Safari o in Chrome.

Penso che ci possa essere un bug in Safari/Chrome in cui le proprietà della posizione della testina non sono disponibili a meno che il supporto non sia attualmente in riproduzione.

La soluzione alternativa era avviare il ciclo appena prima della fine del video e non lasciarlo terminare.

Prova a provare il tuo avviando prima la riproduzione e poi esegui il tuo fuction per vedere se funziona in Safari Chrome.

+0

Questo è un ottimo suggerimento, ma sfortunatamente non è stato d'aiuto per il mio particolare problema. Grazie comunque! – Tovi7

1

Se si attende canplaythrough anziché loadeddata, funziona.

Vedere this codepen example.

+0

Ho provato questo, e non ero nemmeno a conoscenza della proprietà. Ottimo suggerimento, ma sfortunatamente non ha risolto il mio caso. Sono riuscito a risolvere il problema, ma si è rivelato un problema lato server ... Ho aumentato la tua risposta anche se ho imparato qualcosa di nuovo :-) – Tovi7

+0

hai già impostato la configurazione del molo come sopra perché l'uso del tuo suggerimento è stato fatto non funziona per me – vbNewbie