如何使用Servlet流式传输MP3,MP4,AVI等音频/视频文件

Lik*_*oed 10 audio video html5 servlets media-player

我想使用servlet将我的音频/视频文件流式传输到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());
}
Run Code Online (Sandbox Code Playgroud)

以下HTML:

<a href="/media" data-format="mp3 ogg">Click Here!</a>
Run Code Online (Sandbox Code Playgroud)

但是,播放器正在加载... loading ... loading ...

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

Bal*_*usC 16

许多媒体播放器要求服务器支持所谓的HTTP范围请求.即它必须能够根据请求使用Range标题返回媒体文件的特定部分.例如,在10MB长的文件上只有完全索引1000的字节,直到2000.这对于许多媒体播放器是强制性的,以便能够足够快地跳过特定范围的媒体流和/或通过创建多个连接来提高缓冲速度,每个连接请求文件的不同部分.

然而,这是servlet中的许多其他代码,需要很好地理解HTTP Range规范.通常,servletcontainer(Tomcat,JBoss AS,Glassfish等)拥有默认的servlet已经开箱即用.因此,如果有一种方法可以通过标准方法将媒体文件夹发布到Web中,那么您就不需要为此创建一个servlet,那么我将继续这条路线.

目前还不清楚你正在使用哪个servlet容器,所以在这个例子中我将假设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" />
    
    Run Code Online (Sandbox Code Playgroud)

    这样它也可以使用<a href="/media/love.mp3">.

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

但是如果绝对没有办法使用servletcontainer自己的默认servlet,那么你需要以适当支持Range请求的方式重写你的servlet代码.您可以从TomcatDefaultServletOmniFacesFileServlet等开源示例中获取灵感.

也可以看看: