IAm*_*aja 4 html java video servlets video-streaming
我试图让我的 Java 后端将视频文件(MP4 等)“流式传输”到浏览器。我担心我必须编写非常复杂的、低级的 NIO 类型代码,例如:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但看起来这一切都是由 HTML5 元素解决的<video/>(是吗??)。这样,从客户端,我可以指定:
<video width="500" height="500" url="http://myapp.example.com/videos/19394" />
Run Code Online (Sandbox Code Playgroud)
然后,在服务器端,即使是像 一样简单的内容,我也可以指定 URL 请求(例如)和位于 的服务器上的 MP4 文件web.xml之间的映射。还有http://myapp.example.com/videos/19394/opt/videos/video19394.mp4<video/>元素只是自动处理事情。
我在这里是否正确,或者即使我使用了<video/>,我仍然需要在服务器上实现低级字节/套接字流内容?
您可以使用 Spring Boot 框架并仅从 REST 端点提供 InputStream。这也将允许使用 HTML5 中的视频标签进行滚动。
代码看起来像这样:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10669 次 |
| 最近记录: |