H5的audio/video标签播放音频流在safari里问题

safari中audio播放音频流

描述

最近在做H5的video和audio播放视频或音频流的时候遇到问题:在chrome里和安卓里播放都没有问题,但是放到safari和iOS里播放就播放不出来.

接口代码

@RequestMapping(value = "/getVideo", method = RequestMethod.GET)
public void getVideo(HttpServletRequest re , HttpServletResponse resp)
    {
        JSONObject backJO = new JSONObject();
        try {
            FileInputStream file  = null ;
            OutputStream out = null;
            file = new FileInputStream("/Users/xxxxx/video.mp4");
            int sizi = file.available();
            byte[] data = new byte[sizi];
            file.read(data);
            file.close();
            String re_range = re.getHeader("range");
//chrome里每次这个range都是0-到所有,一次性获取所有的文件流;在safari里这个range第一次是0-1,后面是分段获取,所以这里根据request的range的分段,再组装一个content-range放入到response里去;这里代码只适配了safari,如需适配chrome,请加判断,走chrome流程
            String sub_range = re_range.substring(6);
            String[] strs = sub_range.split("-");
            String range = "bytes "+sub_range+"/"+data.length;
            resp.addHeader("content-range",range);
            resp.setContentType("video/mp4");
            int contentLength = Integer.parseInt(strs[1])-Integer.parseInt(strs[0])+1;
            System.out.println("实际长度 = "+contentLength);
            resp.setContentLength(contentLength);
            out = resp.getOutputStream();
		//视频流写的大小,是这次获取的视频流从那个字节位置和这次请求的数据的长度;但是在本地请求一次性获取了所有数据成功了.如果服务部署在服务器上,这时候有一个中间请求全部文件会失败,然后进行了分段获取会成功,至于为什么中间有一次请求会失败(原因未知)
        	out.write(data,Integer.parseInt(strs[0]),contentLength);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ;
    }

提醒

我在这里主要遇到两个问题:
1.一开始不清楚chrome和safari对video和audio标签对视频流的分段获取规则不一样,导致content-range配置的不对.
2.out.write()的时候也根据当前流分段位置,从那到那将数据写入response里,如果写乱了,可能导致播放的时候音频视频顺序错乱.

问题

1.本地服务器是一次性获取,分段的少

在这里插入图片描述
2.部署到服务器上(分段获取,中间有一段会失败)

在这里插入图片描述
虽然有一段获取失败了,但是播放是正常的,为啥这一段失败原因没有继续深究了,如有谁知道,也请不吝赐教.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值