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/zbRdTKQKLWnA2ZiY61Gx
video 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:
Tutti gli avvisi sono per i CSS.
Per aprire il file direttamente sul browser per la prima volta che ricevo:
L'errore è "Impossibile caricare risorsa: carico gestito dal modulo":
Quando I ricarico la pagina ottengo la stessa risposta, ma ora posso riprodurre il video:
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);
Ciao @illusion stai usando https? – r1verside
Ciao @ r1verside! No, usiamo http. – illusion
Riesci a riprodurre questo in un violino con safari? O è specifico per il tuo ambiente (server)? –