ios的Safari浏览器下视频播放问题

  • 起因
  • 原因:
  • 解决方案:
  • 示例代码

起因

最近在做手机端接口对接,后端使用java,前端使用vue开发,在提供给前端视频接口时出现了个问题:

视频在安卓上可以播放,在ios的Safari浏览器就是不能播放;

原因:

  1. 在安卓上,请求一个视频链接,返回一整个视频文件。
  2. 对于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浏览器下视频播放问题相关推荐

  1. window 使用 Edge/Chrome 调试手机 iOS 的 Safari 浏览器

    先上效果图 真机 PC Edge window 使用 Edge/Chrome 调试手机 iOS 的 Safari 浏览器 Safari 是 苹果配套的浏览器,正常来说如果使用的是 macOS 直接一条 ...

  2. iOS中Safari浏览器select下拉列表文字太长被截断的处理方法

    网页中的select下拉列表,文字太长的话在iOS的Safari浏览器里会被自动截断,显示成下面这种: 安卓版的浏览器则没有这个问题. 如何让下拉列表中的文字在iOS的Safari浏览器里显示完整呢? ...

  3. ios运行html游戏,Html游戏 - IOS的​​Safari浏览器崩溃

    我正在运行一个HTML应用程序开发使用打字稿,pixi.js webgl,网络音频.Html游戏 - IOS的​​Safari浏览器崩溃 游戏在各种设备和浏览器上的windows和android上运行 ...

  4. Safari浏览器下colgroup失效导致表格列宽均分

    Safari浏览器下colgroup失效导致表格列宽均分 表现 原因 解决 表现 使用原生tabel标签写表格,由于需要对表头做特殊处理,所以采用两个表格组装的方式写,表头也是用单独的table标签写 ...

  5. Element-UI在safari浏览器下table列表无法对齐的问题

    由于Element-UI的table列表会在两个column中间添加一条能够拖动的竖线,(可能表现的不明显以至于很多人并没有发现,但是竖线是确实存在的.)在safari浏览器下这个竖线的样式无法正确渲 ...

  6. 处理苹果IOS手机safari 浏览器自动识别电话并且黑化样式的问题

    处理苹果IOS手机safari 浏览器自动识别电话并且黑化样式的问题,今天突然打开我们的推广落地页发现电话没显示,仔细看才发现样式被黑化了,2种方式处理: 问题如图,细节很小但很重要. 1,在头部增加 ...

  7. 苹果手机上滑动会卡顿_苹果手机Safari浏览器下滑动卡顿的问题

    一.缘起 最近在做一个项目,项目是在微信的内置浏览器上面运行的,其实就是做一个Web App,然后套在微信里面跑.那么问题来了: Web App的首页在安卓手机上一切正常,可是一到苹果手机,首页的滑动 ...

  8. ios中safari浏览器100vh带有滚动条?

    问题场景 在移动端safari或者chrome浏览器中,使用100vh,会出现滚动条. 根本原因 在safari和chrome浏览器中,100vh是指去掉地址栏的高度,所以会出现滚动条. 解决方案 移 ...

  9. mobile ios 判断safari浏览器

      safari  navigator.userAgent值为: mozilla/5.0(iphone;cup iphone os 6_0_1 like mac os x) applewebkit/5 ...

最新文章

  1. 使用windows.name解决js跨域数据通信
  2. 使用async/await——Nodejs+ExpressJs+Babel
  3. 我的世界javaui材质包怎么下载_【我的世界指南】七、使用皮肤
  4. macos安装homebrew
  5. 洛谷 [SDOI2009]晨跑
  6. SpringCloud动态获取yml文件里面的自定义配置
  7. 从0实现三层神经网络
  8. Leetcode PHP题解--D84 371. Sum of Two Integers
  9. PHP授权系统+盗版追踪+域名IP双授权+在线加密系统
  10. 20-mysql-事务
  11. [BZOJ1036][ZJOI2008]树的统计Count(树链剖分)
  12. day02数据类型方法整理
  13. iOS使用得图SDK开发VR播放器
  14. 2020第十二届全国大学生数学竞赛初赛试题及答案(江苏非数)
  15. 关于K fold交叉验证
  16. GB28181公网语音对讲
  17. css解决图片底部留白问题
  18. Unity接入苹果内购(IAP)
  19. NVM详细安装及使用
  20. 2023年了,推荐 5 款 API 管理工具

热门文章

  1. Regsvr 32命令的用处
  2. c语言打印菱形星号七行_打印菱形图案
  3. swi-prolog安装及使用(基于)
  4. 快速上手 Flutter 空安全
  5. python locust提取参数_python+locust性能测试学习笔记
  6. MySQL中聚合函数count的使用和性能优化
  7. Visual Studio滚动条设置
  8. #Matlab# Yalmip CPLEX使用
  9. 利用tabluea分析数据的案例_tableau数据可视化案例
  10. html 音乐 QQ播放器 外链 代码 播放器 外链 代码