【JavaWeb】视频播放/下载

文章讲述了在与同事联调接口时遇到的问题,即iOS低版本无法播放视频。作者通过查找资料并修改代码,实现了视频的断点续传功能,从而解决了问题。提供的代码示例展示了如何处理HTTP响应,包括设置Content-Type、Accept-Ranges、Content-Length和Content-Range等头部信息,以支持视频的分块传输。
摘要由CSDN通过智能技术生成

如题,最近和同事联调接口时,收到反馈,ios低版本的视频播放不了,经网上查找其他大佬的解决方案修改,解决了该问题,话不多说,直接上代码。

    public static void downShowVideo(HttpServletRequest request, HttpServletResponse response, File file){
        ServletOutputStream out = null;
        RandomAccessFile randomFile = null;
        String fileName = file.getName();
        try {
            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;
            }

            response.setContentType("video/mp4");
            response.setHeader("Accept-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);
                }
            }
            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;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new SystemException("未找到有效的视频附件");
        } catch (Exception e) {
            e.printStackTrace();
            throw new SystemException("查看视频附件时出现异常 " + e.getMessage());
        } finally {
            try {
                if (null != out) {
                    out.close();
                }
                if (null != randomFile) {
                    randomFile.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

注:

  • File 为视频文件
  • SystemException 为我当前项目的自定义异常,使用时可根据自身实际做修改,或直接往外抛出异常。

经测试,下载和播放均无问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值