解决html5中的video标签ios系统中无法播放使用的问
建站知识 2021-07-02 23:00www.168986.cn长沙网站建设
1.先是从前端的角度去考虑,如何让safari浏览器兼容video,并支持播放(未找到解决的方法)。
2.经多次查找网上信息,发现使用后台能解决该问题,解决点在HTTP协议的响应头里面(Aept-Ranges)。
3.safari浏览器,在打开视频的时候,先是发送一个请求探测文件的大小,之后再多次发送请求分段获取数据流的数据(个人理解大概是分段下载,Aept-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 { RandomAessFile randomFile = new RandomAessFile(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("Aept-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系统无法播放内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章,希望大家以后多多支持狼蚁SEO!
长沙网站设计
- 如何进行东阳SEO关键词优化?
- 边坝哪有关键词排名优化:提升你的网站流量与
- 安国百度优化服务:提升您的在线可见性
- 阜康新手做SEO怎么做
- 山西seo网站排名关键词优化:提升您网站曝光率
- 临沂seo网站排名关键词优化:提高你的网站可见
- 广西SEO网站推广怎样付费比较合理
- 双辽SEO网站推广:提升你的网站可见性与流量
- 辽宁企业网站优化购买方式有哪些
- 提升宝清百度SEO排名的实用技巧与策略
- 静宁百度SEO排名:提升您网站曝光率的关键策略
- 彭州百度SEO排名的提升策略和实施指南
- 广南百度关键词SEO:提升网站排名的关键策略
- 辽宁关键词优化怎么做论坛营销
- 吉林百度seo排名如何做到让用户满意
- 内黄百度优化服务:提升在线可见性的关键