2012-10-09 8 views
5

Ho impostato un po 'di un sito di test .. Sto cercando di implementare un video HTML5 da riprodurre su un sito che sto sviluppando e voglio usa jplayer in modo che ricada su un file swf se il video html5 non è supportato.Il client chiude la connessione durante lo streaming di m4v da apache a chrome con jplayer

http://dev.johnhunt.com.au/ è quello che ho finora. Funziona bene se fornisco http://www.jplayer.org/video/m4v/Big_Buck_Bunny_Trailer_480x270_h264aac.m4v per il video, tuttavia se lo ospita sul mio server semplicemente non inizia mai a giocare.

Il tipo mime è sicuramente corretto, video/m4v. Charles procura dice:

Client closed connection before receiving entire response 

Infatti, ecco l'intera richiesta:

GET /Big_Buck_Bunny_Trailer_480x270_h264aac.m4v HTTP/1.1 
Host dev.johnhunt.com.au 
Cache-Control no-cache 
Accept-Encoding identity;q=1, *;q=0 
Pragma no-cache 
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 
Accept */* 
Referer http://dev.johnhunt.com.au/ 
Accept-Language en-US,en;q=0.8 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Cookie __utma=120066461.1007786402.1349773481.1349773481.1349786970.2; __utmb=120066461.1.10.1349786970; __utmc=120066461; __utmz=120066461.1349773481.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none) 
Range bytes=0- 

E la risposta:

Some binary data (maybe 3 or 4kbytes long) 

Il che sembra ok. Presumo che il 'client' sia il mio browser Chrome. Perché rinunciare? Come posso risolvere questo? E 'facendo impazzire come io non riesco a trovare nulla su google :(

Quando uso il file m4v su jplayer.org questa è la richiesta:

GET /video/m4v/Big_Buck_Bunny_Trailer_480x270_h264aac.m4v HTTP/1.1 
Host www.jplayer.org 
Cache-Control no-cache 
Accept-Encoding identity;q=1, *;q=0 
Pragma no-cache 
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4 
Accept */* 
Referer http://dev.johnhunt.com.au/ 
Accept-Language en-US,en;q=0.8 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Cookie __utma=24821473.325705124.1349773077.1349773077.1349773077.1; __utmc=24821473; __utmz=24821473.1349773077.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided) 
Range bytes=0- 

Risposta:

Lots of binary data (very long.. working) 

Cheers, John.

+0

nota, Preferirei di no usa jwplayer perché non è open source. –

+0

In aggiunta: in Chrome sotto la scheda di rete degli strumenti dev ottengo due richieste per il file video, il primo ha lo stato di attesa, il secondo ha lo stato di annullato, entrambi i tipi in sospeso, ma lo stato annullato uno è in rosso. Entrambe le dimensioni sono 13 byte, il tempo sul secondo è 551 ms. –

risposta

8

Ho scoperto che quando il browser Chrome invia una richiesta "Range: byte = 0", NON è necessario rispondere con una risposta "206 contenuto parziale". Per far sì che Chrome gestisca correttamente i dati, devi inviare un'intestazione "200 OK".

Non so se questo è corretto secondo le specifiche ma fa funzionare Chrome e non sembra rompere altri browser.

+1

È vero, chrome non riesce a fornire video mentre altri (Firefox e Safari) lo fanno perfettamente. –

+1

C'è un modo per cambiare questo stato di risposta in apache invece di creare un'app per intercettare il flusso e cambiare il codice di stato? –

+1

Wow, grazie per la risposta, mi sono imbattuto esattamente nella stessa cosa scrivendo il mio server http su Android. Restituire 200 invece di 216 effettivamente lo risolve! – Maks

0

potrebbe essere un problema da apache ... presumibilmente si utilizza Apache dato il tag.

Hai aggiunto i tipi di mime ad apache?

ad es.

AddType video/mp4 mp4

AddType video/mp4 m4v

Verificate anche che gzip è disattivata per i media ... che è già compresso ... e non gzip JPlayer. swf.

Puoi pubblicare la tua configurazione di Apache? Si sta utilizzando i moduli di streaming come this?

Acclamazioni Robin

EDIT

o e anche si potrebbe desiderare di accettare-gamme di byte in apache. Se osservi attentamente i due link stai servendo un 200 e stanno scontando 206 dati parziali.

1

Avendo appena eseguito questa operazione con Chrome, sembra che sia necessario assicurarsi che l'intestazione Content-Range sia impostata dal server nella risposta.

Da http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html:

Esempi di valori byte-content-gamma-spec, assumendo che l'entità contiene un totale di 1234 byte:

 
     . The first 500 bytes: 
     bytes 0-499/1234 
     . The second 500 bytes: 
     bytes 500-999/1234 
     . All except for the first 500 bytes: 
     bytes 500-1233/1234 
     . The last 500 bytes: 
     bytes 734-1233/1234