Como transmitir arquivos de áudio / vídeo como MP3, MP4, AVI, etc usando um Servlet

Gostaria de transmitir meus arquivos de áudio / vídeo para a web usando o servlet.

Eu fiz uma tentativa com o seguinte 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 o seguinte HTML:

 Click Here! 

No entanto, o jogador está apenas carregando … carregando … carregando …

Como isso é causado e como posso resolvê-lo?

Muitos media players requerem que o servidor suporte as chamadas solicitações de intervalo HTTP. Ou seja, deve ser capaz de retornar partes específicas do arquivo de mídia sob solicitação com um header Range . Por exemplo, apenas os bytes em exatamente o índice 1000 até com 2000 em um arquivo de 10 MB de comprimento. Isso é obrigatório para muitos players de mídia, a fim de poder saltar um determinado intervalo do stream de mídia com rapidez suficiente e / ou melhorar a velocidade do buffer, criando várias conexões, cada uma solicitando partes diferentes do arquivo.

No entanto, esse é um grande número de códigos adicionais em seu servlet, o que requer um bom entendimento da especificação do Range HTTP. Normalmente o servlet padrão do servletcontainerer (Tomcat, JBoss AS, Glassfish, etc) já suporta isso fora da checkbox. Portanto, se houver uma maneira de publicar a pasta de mídia na Web por meios padrão, para que você não precise criar um servlet para isso, então eu seguirei esse caminho.

Não está claro qual servletcontainer você está usando, então vou assumir o Tomcat neste exemplo:

  1. Basta soltar o arquivo https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 no conteúdo público da web do projeto da web, para que ele esteja disponível apenas por sem a necessidade de um servlet inteiro.

  2. Ou, coloque o arquivo https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 em uma nova subpasta da pasta Tomcat/webapps , por exemplo, 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 . Desta forma, está disponível por .

  3. Ou coloque o arquivo https://stackoverflow.com/questions/13588149/how-to-stream-audio-video-files-such-as-mp3-mp4-avi-etc-using-a-servlet/love.mp3 em outro lugar no disco, por exemplo, /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 adicione a pasta /media como novo contexto adicionando a seguinte linha ao /conf/server.xml do Tomcat:

      

    Desta forma, ele está disponível por também.

De qualquer maneira, o DefaultServlet do Tomcat, que possui suporte adequado para solicitações de Range , será usado para transmitir o conteúdo.

Mas se não há absolutamente nenhuma maneira de usar o servlet padrão do próprio servlet, então você precisa rewrite o seu código de servlet de forma que ele ofereça suporte aos pedidos de Range . Você pode se inspirar em exemplos de código aberto, como o Tomcat DefaultServlet e o OmniFaces FileServlet .

Veja também:

  • Vídeo usando HTML 5 e servlet