ios的Safari浏览器下视频播放问题
ios的Safari浏览器下视频播放问题
- 起因
- 原因:
- 解决方案:
- 示例代码
起因
最近在做手机端接口对接,后端使用java,前端使用vue开发,在提供给前端视频接口时出现了个问题:
视频在安卓上可以播放,在ios的Safari浏览器就是不能播放;
原因:
- 在安卓上,请求一个视频链接,返回一整个视频文件。
- 对于ios来说,他不是一次性请求全部文件的,一般首先会请求0-1字节,这个写在request header的"range"字段中:range:‘bytes=0-1’
如果想要传输视频,必须要解析range字段,然后按照range字段的要求返回对应的数据,同时response header至少要包含三个字段:“Content-Type”, “Content-Range”, “Content-Length”
“Content-Type"必需明确指定视频格式,有"video/mp4”, “video/ogg”, "video/mov"等等。
"Content-Range"格式是 “bytes -/”,其中start和end必需对应request header里的range字段,total是文件总大小,不是返回的数据长度
"Content-Length"指定返回的二进制长度
解决方案:
解决方案: 后端根据视频请求流字节进行拆分返回,不要直接返回一个整个视频
示例代码
下面代码主要显示mp4格式
import cn.hutool.core.io.FileUtil;@GetMapping("/video/{pictureId:.+}")public void renderVideo(@PathVariable("pictureId") String pictureId, HttpServletResponse response,HttpServletRequest request) {try {//根据id 获取文件信息DwzdFileInfo dwzdFileInfo = dwzdFileInfoService.get(pictureId);//获取文件真实路径String filePath = dwzdFileInfo.getFilePath();File file = FileUtil.file(filePath);//只读模式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;}byte[] buffer = new byte[4096];response.setContentType("video/mp4");response.setHeader("Accept-Ranges", "bytes");response.setHeader("ETag", dwzdFileInfo.getFileName());response.setHeader("Last-Modified", new Date().toString());//第一次请求只返回content length来让客户端请求多次实际数据if(range == null){response.setHeader("Content-length", contentLength + "");}else{//以后的多次以断点续传的方式来返回视频数据 //206response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);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){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();} catch (Exception e) {//如果找不到图片就返回一个默认图片try {String path404 = request.getSession().getServletContext().getRealPath("/static/404.png");byte[] bytes = FileUtil.readBytes(path404);response.getOutputStream().write(bytes);} catch (IOException e1) {e1.printStackTrace();}}}
参考链接:
https://blog.csdn.net/qq_27800521/article/details/88247301
https://blog.csdn.net/zhengbin6072/article/details/78235004
https://blog.csdn.net/bangbDIV/article/details/81912892
ios的Safari浏览器下视频播放问题相关推荐
- window 使用 Edge/Chrome 调试手机 iOS 的 Safari 浏览器
先上效果图 真机 PC Edge window 使用 Edge/Chrome 调试手机 iOS 的 Safari 浏览器 Safari 是 苹果配套的浏览器,正常来说如果使用的是 macOS 直接一条 ...
- iOS中Safari浏览器select下拉列表文字太长被截断的处理方法
网页中的select下拉列表,文字太长的话在iOS的Safari浏览器里会被自动截断,显示成下面这种: 安卓版的浏览器则没有这个问题. 如何让下拉列表中的文字在iOS的Safari浏览器里显示完整呢? ...
- ios运行html游戏,Html游戏 - IOS的Safari浏览器崩溃
我正在运行一个HTML应用程序开发使用打字稿,pixi.js webgl,网络音频.Html游戏 - IOS的Safari浏览器崩溃 游戏在各种设备和浏览器上的windows和android上运行 ...
- Safari浏览器下colgroup失效导致表格列宽均分
Safari浏览器下colgroup失效导致表格列宽均分 表现 原因 解决 表现 使用原生tabel标签写表格,由于需要对表头做特殊处理,所以采用两个表格组装的方式写,表头也是用单独的table标签写 ...
- Element-UI在safari浏览器下table列表无法对齐的问题
由于Element-UI的table列表会在两个column中间添加一条能够拖动的竖线,(可能表现的不明显以至于很多人并没有发现,但是竖线是确实存在的.)在safari浏览器下这个竖线的样式无法正确渲 ...
- 处理苹果IOS手机safari 浏览器自动识别电话并且黑化样式的问题
处理苹果IOS手机safari 浏览器自动识别电话并且黑化样式的问题,今天突然打开我们的推广落地页发现电话没显示,仔细看才发现样式被黑化了,2种方式处理: 问题如图,细节很小但很重要. 1,在头部增加 ...
- 苹果手机上滑动会卡顿_苹果手机Safari浏览器下滑动卡顿的问题
一.缘起 最近在做一个项目,项目是在微信的内置浏览器上面运行的,其实就是做一个Web App,然后套在微信里面跑.那么问题来了: Web App的首页在安卓手机上一切正常,可是一到苹果手机,首页的滑动 ...
- ios中safari浏览器100vh带有滚动条?
问题场景 在移动端safari或者chrome浏览器中,使用100vh,会出现滚动条. 根本原因 在safari和chrome浏览器中,100vh是指去掉地址栏的高度,所以会出现滚动条. 解决方案 移 ...
- mobile ios 判断safari浏览器
safari navigator.userAgent值为: mozilla/5.0(iphone;cup iphone os 6_0_1 like mac os x) applewebkit/5 ...
最新文章
- 使用windows.name解决js跨域数据通信
- 使用async/await——Nodejs+ExpressJs+Babel
- 我的世界javaui材质包怎么下载_【我的世界指南】七、使用皮肤
- macos安装homebrew
- 洛谷 [SDOI2009]晨跑
- SpringCloud动态获取yml文件里面的自定义配置
- 从0实现三层神经网络
- Leetcode PHP题解--D84 371. Sum of Two Integers
- PHP授权系统+盗版追踪+域名IP双授权+在线加密系统
- 20-mysql-事务
- [BZOJ1036][ZJOI2008]树的统计Count(树链剖分)
- day02数据类型方法整理
- iOS使用得图SDK开发VR播放器
- 2020第十二届全国大学生数学竞赛初赛试题及答案(江苏非数)
- 关于K fold交叉验证
- GB28181公网语音对讲
- css解决图片底部留白问题
- Unity接入苹果内购(IAP)
- NVM详细安装及使用
- 2023年了,推荐 5 款 API 管理工具