解决html5中的video标签ios系统中无法播放使用的问题分享!

1.先是从前端的角度去考虑,如何让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系统中无法播放使用的问题的文章就介绍到这了,更多相关html5中的video标签ios系统无法播放内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章,希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/htm5ctutorials/471791.html

(0)
上一篇 2020年10月26日
下一篇 2020年10月26日

精彩推荐