我想用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>
然而,玩家只需加载中...加载中...载入中...
这是怎么造成的,我该怎么解决呢?
很多的媒体播放器需要服务器支持所谓的HTTP范围请求。 也就是说,它必须能够在与请求返回的媒体文件的特定部分Range
头。 例如,只有在准确的指数直到1000与2000年的长10MB的文件的字节数。 这是强制性的许多媒体播放器,以便能够快速跳过一定范围内的媒体流的充足和/或通过创建多个连接,每个请求的文件的不同部分,以提高缓冲速度。
但是,这是在你的servlet了很多额外的代码需要HTTP的一个很好的理解Range
规范。 通常servletcontainer的(是Tomcat,JBoss AS中,Glassfish的,等等)自己的默认servlet已经支持这个开箱。 所以,如果有发布媒体文件通过标准手段的网络,这样你就不需要homegrow此一个servlet的方式,那么我会走这条路的。
目前还不清楚这servletcontainer你使用,所以我会在这个例子中假设的Tomcat:
刚落love.mp3
在web项目的公共Web内容的文件,以便它只是提供<a href="love.mp3">
,而不需要一个整体的servlet。
或者,把love.mp3
文件中的新子文件夹Tomcat/webapps
的文件夹,例如Tomcat/webapps/media/love.mp3
。 这种方式是通过提供<a href="/media/love.mp3">
。
或者,把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
。
也可以看看: