html5播放java后台返回视频流? 报错-问答-阿里云开发者社区-阿里云

开发者社区> 优选2> 正文

html5播放java后台返回视频流? 报错

2020-06-04 18:05:48 282 1

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;
			}
		}
	}



取消 提交回答
全部回答(1)
  • 优选2
    2020-06-05 13:12:18

    兄弟,我们是智能家居公司,有个流媒体服务器的项目外包。能否交流一下?我的QQ718140459,TEL13911017746,我在北京。

    0 0
相关问答

40

回答

[@徐雷frank][¥20]什么是JAVA的平台无关性

大河人家 2018-10-29 23:55:20 144276浏览量 回答数 40

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 223004浏览量 回答数 162

8

回答

OceanBase 使用动画(持续更新)

mq4096 2019-02-20 17:16:36 333878浏览量 回答数 8

13

回答

[@饭娱咖啡][¥20]我想知道 Java 关于引用那一块的知识

心意乱 2018-10-31 18:44:12 142137浏览量 回答数 13

110

回答

OSS存储服务-客户端工具

newegg11 2012-05-17 15:37:18 292289浏览量 回答数 110

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 146785浏览量 回答数 22

18

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 643136浏览量 回答数 18

31

回答

[@倚贤][¥20]刚学完html/css/js的新手学习servlet、jsp需要注意哪些问题?

弗洛伊德6 2018-10-27 21:52:43 145626浏览量 回答数 31

42

回答

【精品问答集锦】Python热门问题

小六码奴 2019-05-30 15:27:34 135561浏览量 回答数 42

10

回答

[@墨玖tao][¥20]为什么流式处理框架都是 java 写成的,JVM 是不是在流和批存在着特殊优势。还有分布式资源调度,感觉Mesos 的成长速度跟不上 Yarn。这是为什么?

管理贝贝 2018-10-23 13:18:03 136129浏览量 回答数 10
+关注
0
文章
526
问答
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载