Come eseguire lo streaming di file audio / video come MP3, MP4, AVI, ecc. Utilizzando un servlet

Mi piacerebbe far scorrere i miei file audio / video sul web usando la servlet.

Ho fatto un tentativo con il seguente servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { File file = new File("/Users/myfolder/Documents/workspace/love.mp3"); response.setContentType(getServletContext().getMimeType(file.getName())); response.setContentLength((int) file.length()); Files.copy(file.toPath(), response.getOutputStream()); } 

E il seguente HTML:

 Click Here! 

Tuttavia, il giocatore sta caricando … caricando … caricando …

Come è causato e come posso risolverlo?

Molti lettori multimediali richiedono che il server supporti le cosiddette richieste di intervallo HTTP. Vale a dire deve essere in grado di restituire parti specifiche del file multimediale su richiesta con un’intestazione Range . Ad esempio, solo i byte esattamente nell’indice 1000 fino a 2000 in un file lungo 10 MB. Questo è obbligatorio per molti lettori multimediali per poter saltare un certo intervallo del stream multimediale abbastanza velocemente e / o per migliorare la velocità del buffer creando più connessioni che richiedono ciascuna parti diverse del file.

Questo è comunque un sacco di codice aggiuntivo nel servlet che richiede una buona comprensione delle specifiche della Range HTTP. Solitamente il servlet predefinito del servlet container (Tomcat, JBoss AS, Glassfish, ecc.) Lo supporta già. Quindi, se c’è un modo per pubblicare la cartella media sul web con mezzi standard, così che non è necessario disporre di un servlet per questo, allora andrei su questa rotta.

Non è chiaro quale servlet container stai usando, quindi assumerò Tomcat in questo esempio:

  1. Basta rilasciare il file https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 nel contenuto Web pubblico del progetto Web, in modo che sia disponibile solo senza la necessità di un intero servlet.

  2. In alternativa, inserisci il file https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 in una nuova sottocartella della cartella Tomcat/webapps , ad es. Tomcat/webapps/media/https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 . In questo modo è disponibile .

  3. Oppure, metti il ​​file https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 altrove sul disco, ad esempio /path/to/media/https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 e aggiungi la cartella /media come nuovo contesto aggiungendo la seguente riga a /conf/server.xml di Tomcat:

      

    In questo modo è disponibile anche per .

In entrambi i casi, il DefaultServlet Tomcat, che ha il supporto adeguato per le richieste Range , verrà utilizzato per lo streaming del contenuto.

Ma se non è assolutamente ansible utilizzare il servlet predefinito di servlet container, è necessario riscrivere il codice servlet in modo tale da supportare correttamente le richieste Range . Puoi trarre ispirazione da esempi open source come Tomcat DefaultServlet e OmniFaces FileServlet .

Guarda anche:

  • Video Utilizzo di HTML 5 e servlet