如何使用Servlet来传输音频/视频文件,如MP3,MP4,AVI等(How to stream

2019-06-21 07:19发布

我想用servlet来我的音频/视频文件流式传输到网络。

我做了以下的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());
}

而下面的HTML:

<a href="/media" data-format="mp3 ogg">Click Here!</a>

然而,玩家只需加载中...加载中...载入中...

这是怎么造成的,我该怎么解决呢?

Answer 1:

很多的媒体播放器需要服务器支持所谓的HTTP范围请求。 也就是说,它必须能够在与请求返回的媒体文件的特定部分Range头。 例如,只有在准确的指数直到1000与2000年的长10MB的文件的字节数。 这是强制性的许多媒体播放器,以便能够快速跳过一定范围内的媒体流的充足和/或通过创建多个连接,每个请求的文件的不同部分,以提高缓冲速度。

但是,这是在你的servlet了很多额外的代码需要HTTP的一个很好的理解Range规范。 通常servletcontainer的(是Tomcat,JBoss AS中,Glassfish的,等等)自己的默认servlet已经支持这个开箱。 所以,如果有发布媒体文件通过标准手段的网络,这样你就不需要homegrow此一个servlet的方式,那么我会走这条路的。

目前还不清楚这servletcontainer你使用,所以我会在这个例子中假设的Tomcat:

  1. 刚落love.mp3在web项目的公共Web内容的文件,以便它只是提供<a href="love.mp3"> ,而不需要一个整体的servlet。

  2. 或者,把love.mp3文件中的新子文件夹Tomcat/webapps的文件夹,例如Tomcat/webapps/media/love.mp3 。 这种方式是通过提供<a href="/media/love.mp3">

  3. 或者,把love.mp3文件的其他磁盘上,如/path/to/media/love.mp3并添加/media通过添加以下行到Tomcat的文件夹作为新的上下文/conf/server.xml

     <Context docBase="/path/to/media" path="/media" /> 

    这种方式是通过提供<a href="/media/love.mp3">为好。

无论哪种方式,Tomcat的自己DefaultServlet ,其中有适当的支持Range的请求,将用于将内容流传输。

但是,如果有绝对没有办法利用servletcontainer自己的默认servlet,那么你需要重写这样的方式你的servlet代码,它正确地支持Range请求。 您可以从开源的例子,如获得灵感的Tomcat DefaultServlet和OmniFaces FileServlet

也可以看看:

  • 视频使用HTML 5和servlet


文章来源: How to stream audio/video files such as MP3, MP4, AVI, etc using a Servlet