html5播放java后台返回视频流? 400 报错
由于公司要求视频播放需要对链接进行认证,所以我想在java代码中处理请求,然后再把视频流写回客户端。
但是页面使用的video标签始终不能播放。如果这种方案不行,那么还有其他的解决方案吗?
以下是我返回流的代码:
private void processRequest(final HttpServletRequest request,
final HttpServletResponse response) throws IOException {
// String videoFilename =
// URLDecoder.decode(request.getParameter("video"), "UTF-8");
String videoFilename = "20150121_130906.mp4";
Path video = Paths.get(videoPath, videoFilename);
int length = (int) Files.size(video);
LogUtil.paramAndResultLocal("--processRequest-", "length-" + length, "");
int start = 0;
int end = length - 1;
String range = request.getHeader("Range");
Matcher matcher = RANGE_PATTERN.matcher(range);
if (matcher.matches()) {
String startGroup = matcher.group("start");
start = startGroup.isEmpty() ? start : Integer.valueOf(startGroup);
start = start < 0 ? 0 : start;
String endGroup = matcher.group("end");
end = endGroup.isEmpty() ? end : Integer.valueOf(endGroup);
end = end > length - 1 ? length - 1 : end;
}
int contentLength = end - start + 1;
LogUtil.paramAndResultLocal("--processRequest-", "start-" + start,
"-end-" + end);
response.reset();
response.setBufferSize(BUFFER_LENGTH);
response.setHeader("Content-Disposition",
String.format("inline;filename=\"%s\"", videoFilename));
response.setHeader("Accept-Ranges", "bytes");
// response.setDateHeader("Last-Modified",
// Files.getLastModifiedTime(video).toMillis());
// response.setDateHeader("Expires", System.currentTimeMillis() +
// EXPIRE_TIME);
// LogUtil.paramAndResultLocal("--processRequest-",
// "probeContentType-"+Files.probeContentType(video), "");
response.setContentType(Files.probeContentType(video));
response.setHeader("Content-Range",
String.format("bytes %s-%s/%s", start, end, length));
response.setHeader("Content-Length", String.format("%s", contentLength));
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
int bytesRead;
int bytesLeft = contentLength;
ByteBuffer buffer = ByteBuffer.allocate(BUFFER_LENGTH);
try (SeekableByteChannel input = Files.newByteChannel(video, READ);
OutputStream output = response.getOutputStream()) {
input.position(start);
while ((bytesRead = input.read(buffer)) != -1 && bytesLeft > 0) {
buffer.clear();
output.write(buffer.array(), 0,
bytesLeft < bytesRead ? bytesLeft : bytesRead);
bytesLeft -= bytesRead;
}
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
兄弟,我们是智能家居公司,有个流媒体服务器的项目外包。能否交流一下?我的QQ718140459,TEL13911017746,我在北京。