设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 37|回复: 15

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

[复制链接]

1

主题

53

回帖

126

积分

注册会员

积分
126
发表于 2024-4-20 10:30:38 | 显示全部楼层 |阅读模式
1.先是从前端的角度去考虑,如何让safari浏览器兼容video,并支持播放(未找到解决的方法)。
2.经多次查找网上信息,发现使用后台能解决该问题,解决点在HTTP协议的响应头里面(Accept-Ranges)。
3.safari浏览器,在打开视频的时候,先是发送一个请求探测文件的大小,之后再多次发送请求分段获取数据流的数据(个人理解大概是分段下载,Accept-Ranges)。
4.想要解决这种问题要考虑两个方面:
  1. a.需要根据请求内容的不同做出不同的响应,第一次探测请求需要返回200,后面的请求需要返回206和具体数据
  2. b.contentType必须设置为video/mp4
复制代码
5.具体代码
这里已经封装好了,直接拿过来使用就ok了。
  1. private void sendVideo(HttpServletRequest request, HttpServletResponse response, File file, String fileName) throws FileNotFoundException, IOException {
  2.                 RandomAccessFile randomFile = new RandomAccessFile(file, "r");//只读模式
  3.                 long contentLength = randomFile.length();
  4.         String range = request.getHeader("Range");
  5.         int start = 0, end = 0;
  6.         if(range != null && range.startsWith("bytes=")){
  7.             String[] values = range.split("=")[1].split("-");
  8.             start = Integer.parseInt(values[0]);
  9.             if(values.length > 1){
  10.                 end = Integer.parseInt(values[1]);
  11.             }
  12.         }
  13.         int requestSize = 0;
  14.         if(end != 0 && end > start){
  15.             requestSize = end - start + 1;
  16.         } else {
  17.             requestSize = Integer.MAX_VALUE;
  18.         }

  19.         response.setContentType("video/mp4");
  20.         response.setHeader("Accept-Ranges", "bytes");
  21.         response.setHeader("ETag", fileName);
  22.         response.setHeader("Last-Modified", new Date().toString());
  23.         //第一次请求只返回content length来让客户端请求多次实际数据
  24.         if(range == null){
  25.             response.setHeader("Content-length", contentLength + "");
  26.         }else{
  27.                 //以后的多次以断点续传的方式来返回视频数据
  28.             response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//206
  29.             long requestStart = 0, requestEnd = 0;
  30.             String[] ranges = range.split("=");
  31.             if(ranges.length > 1){
  32.                 String[] rangeDatas = ranges[1].split("-");
  33.                 requestStart = Integer.parseInt(rangeDatas[0]);
  34.                 if(rangeDatas.length > 1){
  35.                     requestEnd = Integer.parseInt(rangeDatas[1]);
  36.                 }
  37.             }
  38.             long length = 0;
  39.             if(requestEnd > 0){
  40.                 length = requestEnd - requestStart + 1;
  41.                 response.setHeader("Content-length", "" + length);
  42.                 response.setHeader("Content-Range", "bytes " + requestStart + "-" + requestEnd + "/" + contentLength);
  43.             }else{
  44.                 length = contentLength - requestStart;
  45.                 response.setHeader("Content-length", "" + length);
  46.                 response.setHeader("Content-Range", "bytes "+ requestStart + "-" + (contentLength - 1) + "/" + contentLength);
  47.             }
  48.         }
  49.         ServletOutputStream out = response.getOutputStream();
  50.         int needSize = requestSize;
  51.         randomFile.seek(start);
  52.         while(needSize > 0){
  53.             byte[] buffer = new byte[4096];
  54.             int len = randomFile.read(buffer);
  55.             if(needSize < buffer.length){
  56.                 out.write(buffer, 0, needSize);
  57.             } else {
  58.                 out.write(buffer, 0, len);
  59.                 if(len < buffer.length){
  60.                     break;
  61.                 }
  62.             }
  63.             needSize -= buffer.length;
  64.         }
  65.         randomFile.close();
  66.         out.close();
  67.                
  68.         }
复制代码
总结
到此这篇关于解决html5中的video标签ios系统中无法播放使用的问题的文章就介绍到这了,更多相关html5中的video标签ios系统无法播放内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

0

主题

79

回帖

159

积分

注册会员

积分
159
发表于 2024-5-10 19:39:00 | 显示全部楼层
你的信息来源是?我想了解更多。
  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:11
  • 最近打卡:2024-05-05 22:00:43

1

主题

49

回帖

132

积分

注册会员

积分
132
发表于 2024-5-22 20:32:51 | 显示全部楼层
666666666666
  • 打卡等级:偶尔看看
  • 打卡总天数:9
  • 打卡月天数:0
  • 打卡总奖励:672
  • 最近打卡:2024-06-27 11:19:34

1

主题

75

回帖

942

积分

等待验证会员

积分
942
发表于 2024-6-12 12:27:29 | 显示全部楼层
同意你的观点,我们有共鸣。

1

主题

53

回帖

106

积分

注册会员

积分
106
发表于 2024-8-4 08:16:42 | 显示全部楼层
这个话题真是有趣,我也对它感兴趣。
  • 打卡等级:无名新人
  • 打卡总天数:2
  • 打卡月天数:1
  • 打卡总奖励:64
  • 最近打卡:2024-11-08 12:03:30

2

主题

51

回帖

221

积分

中级会员

积分
221

热心会员付费会员

发表于 2024-8-5 23:32:03 | 显示全部楼层
同意你的观点,我们有共鸣。

1

主题

43

回帖

109

积分

注册会员

积分
109
发表于 2024-8-13 15:52:19 | 显示全部楼层
好用好用

1

主题

78

回帖

168

积分

注册会员

积分
168
发表于 2024-8-29 11:14:35 | 显示全部楼层
666666666666

0

主题

63

回帖

127

积分

注册会员

积分
127
发表于 2024-9-3 13:12:18 | 显示全部楼层
谢谢你分享这个信息
发表于 2024-9-12 03:31:02 | 显示全部楼层
已测试,非常不错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 10:54 , Processed in 0.114248 second(s), 27 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表