通过HTML5视频元素的Java多媒体流 [英] Java multimedia streaming via HTML5 video element

查看:995
本文介绍了通过HTML5视频元素的Java多媒体流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试允许我的Java后端将视频文件(MP4等)流到浏览器。我担心我必须编写非常复杂的,低级实用的NIO类型代码,如:

I am trying to allow my Java backend to "stream" video files (MP4, etc.) to browsers. I was worried that I would have to write really complicated, low-level-practically-NIO type code like:

public class VideoController extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        File f = new File("/opt/videos/video19394.mp4");
        PrintStream ps = resp.getWriter();

        while(still reading f) {
            writeTheVideoBytesToStream(f, ps);
        }
    }
}

似乎就像使用HTML5 < video /> 元素(是?? )一样。这样,从客户端,我可以指定:

But it seems like this is all taken care of with the HTML5 <video/> element (yes??). This way, from the client-side, I can just specify:

<video width="500" height="500" url="http://myapp.example.com/videos/19394" />

然后,在服务器端,即使是像这样简单的东西web.xml ,我可以指定URL请求之间的映射,如 http://myapp.example.com/videos/19394 和MP4位于服务器上的文件 /opt/videos/video19394.mp4 。而< video /> 元素只是自动处理事情。

And then, on the server-side, even in something as simple as web.xml, I can just specify the mapping between URL requests like http://myapp.example.com/videos/19394 and the MP4 file located on the server at /opt/videos/video19394.mp4. And the <video/> element just takes care of things automagically.

我是否正确在这里,或者即使我使用< video /> ,我还需要在服务器上实现低级别的字节/套接字流式传输吗?

Am I correct here, or even if I used <video/>, would I still need to implement low-level byte/socket streaming stuff on the server?

推荐答案

您可以使用Spring Boot框架,只需从REST端点提供InputStream。
这也允许使用HTML5中的视频标签滚动。

You can use Spring Boot framework and just serve an InputStream from your REST endpoint. This will allow to scroll using video tag in HTML5 as well.

代码看起来像这样:

@RequestMapping(value = "videos/file-name", method = GET)
@ResponseBody
public final ResponseEntity<InputStreamResource> 
retrieveResource(@PathVariable(value = "file-name")
final String fileName,
@RequestHeader(value = "Range", required = false)
String range) throws Exception {

long rangeStart = Longs.tryParse(range.replace("bytes=","").split("-")[0]);//parse range header, which is bytes=0-10000 or something like that
long rangeEnd = Longs.tryParse(range.replace("bytes=","").split("-")[0]);//parse range header, which is bytes=0-10000 or something like that
long contentLenght = ;//you must have it somewhere stored or read the full file size

InputStream inputStream = Resources.getResource(fileName).openStream();//or read from wherever your data is into stream
HttpHeaders headers = new HttpHeaders();
headers.setContentType("video/mp4");
headers.set("Accept-Ranges", "bytes");
headers.set("Expires", "0");
headers.set("Cache-Control", "no-cache, no-store");
headers.set("Connection", "keep-alive");
headers.set("Content-Transfer-Encoding", "binary");
headers.set("Content-Length", String.valueOf(rangeEnd - rangeStart));

//if start range assume that all content
if (rangeStart == 0) {
  return new ResponseEntity<>(new InputStreamResource(inputStream), headers, OK);
} else {
  headers.set("Content-Range", format("bytes %s-%s/%s", rangeStart, rangeEnd, contentLenght));
  return new ResponseEntity<>(new InputStreamResource(inputStream), headers, PARTIAL_CONTENT);
}
}

这篇关于通过HTML5视频元素的Java多媒体流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆