1.起先过去端的视角去考虑到,怎样让safari访问器适配video,并适用播发(找不到处理的方式)。
2.经数次搜索在网上信息内容,发觉应用后台管理能处理该难题,处理点在HTTP协议书的响应头里边(Accept-Ranges)。
3.safari访问器,在开启视頻的情况下,起先推送一个恳求检测文档的尺寸,以后再好次推送恳求按段获得数据信息流的数据信息(本人了解大约是按段免费下载,Accept-Ranges)。
4.要想处理这类难题要考虑到2个层面:
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系统软件中没法播发应用的难题的文章内容就详细介绍到这了,大量有关html5中的video标识ios系统软件没法播发內容请检索脚本制作之家之前的文章内容或再次访问下边的有关文章内容,期待大伙儿之后多多的适用脚本制作之家!