如何使用Servletstream式传输audio/video文件,如MP3,MP4,AVI等
我想使用servlet将我的audio/video文件stream式传输到Web上。
我尝试了下面的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的文件上。 这对于许多媒体播放器来说是强制性的,以便能够快速跳过一定范围的媒体stream和/或通过创build多个连接来提高缓冲速度,每个连接请求文件的不同部分。
然而,这是你的servlet中的很多额外的代码,需要很好地理解HTTP Range
规范。 通常servlet容器的(Tomcat,JBoss AS,Glassfish等)拥有默认的servlet已经支持这个框。 因此,如果有一种方法可以通过标准方式将媒体文件夹发布到networking上,那么您不需要为此增加一个servlet,那么我就可以继续这个路线。
目前还不清楚你正在使用哪个servlet容器,所以我将在这个例子中假设Tomcat:
-
只需在web项目的公共web内容中放置
love.mp3
文件,这样它就可以通过<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
,并通过love.mp3
添加到Tomcat的/conf/server.xml
来添加/media
文件夹作为新的上下文:<Context docBase="/path/to/media" path="/media" />
这也可以通过
<a href="/media/love.mp3">
来获得。
无论哪种方式,Tomcat自己的DefaultServlet
,其中有适当的Range
请求支持,将用于stream内容。
但是,如果绝对没有办法使用servletcontainer自己的默认servlet,那么您需要重写servlet代码,以便正确支持Range
请求。 您可以从开源示例(如Tomcat DefaultServlet
和OmniFaces FileServlet
获得灵感。
也可以看看:
- video使用HTML 5和servlet