dailila-关键词-解决html5中的video标签ios系统中无法播放使用的问题

这篇文章主要介绍了处理html5中的video标签ios体系中无法播映运用的问题,本文给我们介绍的十分详细,对我们的学习或工作具有必定的参阅学习价值,需求的朋友可以参阅下

1.先是从前端的视点去考虑,dailila如何让safari浏览器兼容video,并支持播映(未找到处理的方法)。

2.经屡次查找网上信息,发现运用后台能处理该问题,处理点在HTTP协议的呼应头里边(Accept-Ranges)。

3.safari浏览器,在打开视频的时分,先是发送一个关键词恳求探测文件的巨细,之后再屡次发送恳求分段获取数据流的数据(个人了解大概是分段下载,Accept-Ranges)。

4.想要处理这种问题要考虑两个方面:

a.需求依据恳求内容的不同做出不同的呼应,第一次探测恳求需求回来200,后边的恳求需求回来206和详细数据

b.contentType必须设置为video/mp4

5.详细代码

这里现已封装好了,直接拿过来运用就ok了。

private void sendVideo(HttpServletRequest request, HttpServletResponse response, File file, String fileName) throws FileNotFoundException, IOException {
RandomAccessFile randomFile = new RandomAccessFile(file, “r”);//只读形式
long contentLength = randomFile.length();
String range = request.getHeader(“Range”);
int start = 0, end = 0;
if(range != null && range.startsWith(“bytes=”)){
String[] values = range.split(“=”)[1].split(“-“);
start = Integer.parseInt(values[0]);
if(values.length > 1){
end = Integer.parseInt(values[1]);
}
}
int requestSize = 0;
if(end != 0 && end > start){
requestSize = end – start + 1;
} else {
requestSize = Integer.MAX_VALUE;
}
response.setContentType(“video/mp4”);
response.setHeader(“Accept-Ranges”, “bytes”);
response.setHeader(“ETag”, fileName);
response.setHeader(“Last-Modified”, new Date().toString());
//第一次恳求只回来content length来让客户端恳求屡次实际数据
if(range == null){
response.setHeader(“Content-length”, contentLength + “”);
}else{
//今后的屡次以断点续传的方式来回来视频数据
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//206
long requestStart = 0, requestEnd = 0;
String[] ranges = range.split(“=”);
if(ranges.length > 1){
String[] rangeDatas = ranges[1].split(“-“);
requestStart = Integer.parseInt(rangeDatas[0]);
if(rangeDatas.length > 1){
requestEnd = Integer.parseInt(rangeDatas[1]);
}
}
long length = 0;
if(requestEnd > 0){
length = requestEnd – requestStart + 1;
response.setHeader(“Content-length”, “” + length);
response.setHeader(“Content-Range”, “bytes ” + requestStart + “-” + requestEnd + “/” + contentLength);
}else{
length = contentLength – requestStart;
response.setHeader(“Content-length”, “” + length);
response.setHeader(“Content-Range”, “bytes “+ requestStart + “-” + (contentLength – 1) + “/” + contentLength);
}
}
ServletOutputStream out = response.getOutputStream();
int needSize = requestSize;
randomFile.seek(start);
while(needSize > 0){
byte[] buffer = new byte[4096];
int len = randomFile.read(buffer);
if(needSize < buffer.length){
out.write(buffer, 0, needSize);
} else {
out.write(buffer, 0, len);
if(len < buffer.length){
break;
}
}
needSize -= buffer.length;
}
randomFile.close();
out.close();
}

总结

到此这篇关于处理html5中的video标签ios体系中无法播映运用的问题的文章就介绍到这