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

标签 html servlets audio video media-player

我想使用 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 范围请求。 IE。它必须能够根据请求返回媒体文件的特定部分 Range header 。例如,对于 10MB 长的文件,只有索引 1000 到 2000 处的字节。这对于许多媒体播放器来说是强制性的,以便能够足够快地跳过一定范围的媒体流和/或通过创建多个连接来提高缓冲速度,每个连接请求文件的不同部分。

然而,这是您的 servlet 中的许多附加代码,需要很好地理解 HTTP Range 规范。通常 servletcontainer(Tomcat、JBoss AS、Glassfish 等)自己的默认 servlet 已经支持它。因此,如果有一种方法可以通过标准方式将媒体文件夹发布到网络上,这样您就不需要为此自行开发一个 servlet,那么我会走这条路。

不清楚您使用的是哪个 servletcontainer,因此在本示例中我假设使用 Tomcat:

  1. 只需放下 love.mp3在 web 项目的公共(public) 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 - 如何使用 Servlet 流式传输 MP3、MP4、AVI 等音频/视频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13941266/

相关文章:

php - IE8 不允许下拉菜单

html - CSS - 找不到背景文件

java - 问题上传图像 servlet - Eclipse,tomcat 服务器

html - flash 到 html5,如何

html - 在按钮内设置跨度对齐

html - Chrome - Colspan 无法按预期工作

java - JSP 找不到 servlet 引用 (404)

java - 如何在java servlet中获取客户端MAC地址?

android - 无法停止录音,线程无法正常工作,应用程序不幸停止

java - 获取两个音频输入流之间的差异 - java