关于读取大视频流的接口

/**
 * 视频流读取
 *
 * @param response
 * @throws Exception
 */
@RequestMapping(value = "/getvideo/{filetype}/{filename:.+}", method = RequestMethod.GET)
public void getvideo(@PathVariable("filename") String filename, @PathVariable("filetype") String filetype, HttpServletResponse response,HttpServletRequest request) throws Exception {
    //获取的图片绝对路径
    String imagePath = location.concat(filetype).concat(File.separator).concat(filename);

    // 取头参数
    String range = request.getHeader("range");
    String browser = request.getHeader("User-Agent");
    if (browser.indexOf("Firefox") != -1) {
        // 火狐浏览器
        byte[] data = getBytesFromFile(new File(imagePath));
        response.setContentType("video/ogg");
        response.setContentLength(data.length);
        response.setHeader("Content-Range", range + Integer.valueOf(data.length - 1));
        response.setHeader("Accept-Ranges", "bytes");
        response.setHeader("Etag", "W/\"9767057-1323779115364\"");

        byte[] content = new byte[1024];
        BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data));
        OutputStream os = response.getOutputStream();
        while (is.read(content) != -1) {
            os.write(content);
        }
        is.close();
        os.close();
    } else if (browser.indexOf("MSIE") != -1) {
        // IE9以上浏览器
        byte[] data = getBytesFromFile(new File(imagePath));
        String diskfilename = "final.mp4";
        response.setContentType("video/mpeg");
        // response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\"");
        response.setContentLength(data.length);
        response.setHeader("Content-Range", range + Integer.valueOf(data.length - 1));
        response.setHeader("Accept-Ranges", "text/x-dvi");
        response.setHeader("Etag", "W/\"9767057-1323779115364\"");
        byte[] content = new byte[1024];
        BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data));
        OutputStream os = response.getOutputStream();
        while (is.read(content) != -1) {
            os.write(content);
        }
        is.close();
        os.close();
    } else if (browser.indexOf("Chrome") != -1) {
        // 谷歌浏览器
        byte[] data = getBytesFromFile(new File(imagePath));
        String diskfilename = "final.mp4";
        response.setContentType("video/mp4");
        // response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\"");
        System.out.println("data.length " + data.length);
        response.setContentLength(data.length);
        response.setHeader("Content-Range", range + Integer.valueOf(data.length - 1));
        response.setHeader("Accept-Ranges", "bytes");
        response.setHeader("Etag", "W/\"9767057-1323779115364\"");
        byte[] content = new byte[1024];
        BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data));
        OutputStream os = response.getOutputStream();
        while (is.read(content) != -1) {
            os.write(content);
        }
        is.close();
        os.close();
    } else if (browser.indexOf("CoreMedia") != -1) {
        // 其他浏览器
        byte[] data = getBytesFromFile(new File(imagePath));
        String diskfilename = "final.mp4";
        response.setContentType("video/mpeg");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + diskfilename + "\"");
        byte[] content = new byte[1024];
        BufferedInputStream is = new BufferedInputStream(new ByteArrayInputStream(data));
        OutputStream os = response.getOutputStream();
        while (is.read(content) != -1) {
            os.write(content);
        }
        is.close();
        os.close();
    }


}

//读取文件字节
private static byte[] getBytesFromFile(File file) throws IOException {
    InputStream is = new FileInputStream(file);
    long length = file.length();
    if (length > Integer.MAX_VALUE) {
        return null;
    }
    byte[] bytes = new byte[(int) length];
    int offset = 0;
    int numRead = 0;
    while ((offset < bytes.length) && ((numRead = is.read(bytes, offset, bytes.length - offset)) >= 0)) {
        offset += numRead;
    }
    if (offset < bytes.length) {
        throw new IOException("Could not completely read file " + file.getName());
    }
    is.close();
    return bytes;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值