2015-07-28 18 views
16

Nel nostro Java EE applicazione usiamo le HTML5 <video> tag per la riproduzione di MP4 video. Utilizziamo JBoss 7 come server delle applicazioni. I video vengono recuperati tramite l'azione Struts2 in questo modo: www.myproject.com/namespace/documents/3/zbRdTKQKLWnA2ZiY61Gxvideo HTML5 in Safari non funziona

dove zbRdTKQKLWnA2ZiY61Gx è un nome di video sul server.

struts.xml:

... 

<action name="documents/*/*" class="namespace.action.GestionDocumentAction" method="obtain"> 
    <param name="typeId">{1}</param> 
    <param name="identifiantDocument">{2}</param> 
    <result name="success" type="stream"> 
     <param name="contentType">video/mp4</param> 
     <param name="inputName">flux</param> 
     <param name="allowCaching">true</param> 
     <param name="contentDisposition">inline;filename=${filename}</param> 
    </result> 
</action> 

... 

Funziona bene in Chrome e Firefox, ma non in Safari su Mac.

In Safari quando apro la pagina contenente un tag <video>, "Caricamento" viene visualizzato ma non carica il video.

Ecco che arriva la cosa davvero strana.

Se incollare il link a un video direttamente nel browser, si gioca correttamente. Quindi se ricarico la pagina con il suddetto video, riproduce fine.

La stessa cosa accade con tutti i video dell'applicazione.

Cosa sta succedendo? Perché i video non vengono riprodotti all'inizio?


strumenti Dev in Safari:

Quando ho inizialmente carico pagina ottengo il seguente risultato: enter image description here

Tutti gli avvisi sono per i CSS.

Per aprire il file direttamente sul browser per la prima volta che ricevo: enter image description here

L'errore è "Impossibile caricare risorsa: carico gestito dal modulo": enter image description here

Quando I ricarico la pagina ottengo la stessa risposta, ma ora posso riprodurre il video: enter image description here

Penso che il problema vada dalle intestazioni di gamma. In realtà ho utilizzare questo:

this.getServletResponse().setHeader("Accept-Ranges", "bytes"); 
this.getServletResponse().setHeader("Content-Type", "video/mp4"); 
this.getServletResponse().setHeader("Content-Length", "383631");  // 383631 - just for exemple, I use a real size 
this.getServletResponse().setHeader("Content-Range", "bytes 0-383630/383631"); // 0-383630/383631 - the same 
this.getServletResponse().setStatus(206); 
+0

Ciao @illusion stai usando https? – r1verside

+0

Ciao @ r1verside! No, usiamo http. – illusion

+0

Riesci a riprodurre questo in un violino con safari? O è specifico per il tuo ambiente (server)? –

risposta

9

Safari ha un problema in cui se la risorsa video richiesto non specificamente avere l'estensione .mp4, anche se il tipo MIME è impostato correttamente.Potrei replicare il tuo problema - se la risorsa video fosse solo un identificatore di stringa (senza .mp4), Safari visualizzerebbe un'anteprima per il video ma non verrebbe effettivamente riprodotta. Quando la risorsa è stata rinominata in filename.mp4, Safari ha iniziato a riprodurre il video come previsto. Chrome ha funzionato bene in entrambi i casi.

Se si cambia classe namespace.action.GestionDocumentAction in modo che quando il secondo parametro termina in .mp4 si spoglia l'estensione di trovare la risorsa locale correttamente nome, dovrebbe essere in grado di restituire il video con l'URL che termina con .mp4 come Safari si aspetta - www.myproject.com/namespace/documents/3/zbRdTKQKLWnA2ZiY61Gx.mp4.

+0

Non ha risolto il problema ma come unica (bella) risposta ti meriti la generosità. – realUser404