最近项目中用到了在线播放视频的功能,总结一下。
基本思路是,服务端取出文件字节流,输出到前端, 网页用video标签播放。
1、前端video标签,src指定请求的url和文件名:
<video style="width: 800px;height: 600px;" controls preload>
<source src="url?vpath=文件服务端路径"></source>
</video>
2、服务端响应请求,用servlet或其他都可以。
public void previewLocal(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 得到文件路径,取文件
String filePath = "D:\\VID.mp4";
// String filePath = request.getParameter("vpath");
File file = new File(filePath);
if (file.exists()) {
String diskfilename = file.getName();
// 取头参数,浏览器信息等,如果需要的话
String range = request.getHeader("range");
String browser = request.getHeader("User-Agent");
logger.info("range:" + range + ",browser:" + browser);
// 设置响应头信息
response.setContentType("video/mp4");
response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\"");
response.setContentLength((int) file.length());
// 前边的range是请求的数据范围,一般"0-",表示从0开始,之后的所有内容
// Content-Range是返回的数据范围,需要快进的话,需要指定有效的范围,不指定不能快进,超出范围也不能快进
response.setHeader("Content-Range", range + (file.length() - 1));
response.setHeader("Accept-Ranges", "bytes");
// 裤子脱完了,开始蹲下干正事,完了记得擦破屁股
InputStream is = new FileInputStream(file);
OutputStream os = response.getOutputStream();
IOUtils.copyBytes(is, os, file.length(), false);
// 擦屁股
is.close();
os.close();
}
}
3、现在的项目好多都赶时髦,弄个HDFS存文件,这样的话,只需要稍加修改。( 前提是HDFS存取文件各种操作都搞定了)
//检查文件存在
if(fs.exits( filePath )){}
//取文件长度:
len = fs.getFileStatus(filePath).getLen();
//得到输入流:
InputStream inputStream = fs.open( filePath );
4、基本功能实现了,完善工作肯定还是有的,遇到问题解决问题吧。