为了账号安全,请及时绑定邮箱和手机立即绑定

视频文件从 java 服务器流式传输到 iPhone

视频文件从 java 服务器流式传输到 iPhone

哆啦的时光机 2022-06-30 18:35:08
我有这个提供视频的 java servlet,这在桌面和 Android 浏览器中运行良好,但在 iPhone 中不显示视频。这是我的 servlet 代码。    OutputStream output;    try (InputStream input = new FileInputStream(videoPath)) {    response.setContentType("video/mp4");    response.setHeader("Content-Disposition", "inline; filename=" + videoID);    output = response.getOutputStream();    byte[] buffer = new byte[2096];    int read;    while ((read = input.read(buffer)) != -1) {        output.write(buffer, 0, read);    }    output.flush();    output.close();}
查看完整描述

2 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

iPhone 要求服务器正确处理字节范围请求。



查看完整回答
反对 回复 2022-06-30
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

如果有更好的实施,请分享。


OutputStream output;

if (request.getHeader("range") != null) {

    response.setStatus(206);

    String rangeValue = request.getHeader("range").trim().substring("bytes=".length());

    long fileLength = outputFile.length();

    long start, end;

    if (rangeValue.startsWith("-")) {

        end = fileLength - 1;

        start = fileLength - 1 - Long.parseLong(rangeValue.substring("-".length()));

    } else {

        String[] range = rangeValue.split("-");

        start = Long.parseLong(range[0]);

        end = range.length > 1 ? Long.parseLong(range[1]) : fileLength - 1;

    }

    if (end > fileLength - 1) {

        end = fileLength - 1;

    }

    if (start <= end) {

        long contentLength = end - start + 1;

        response.setHeader("Content-Length", contentLength + "");

        response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);

        response.setHeader("Content-Type", "video/mp4");

        response.setHeader("Content-Disposition", "inline; filename=test.mp4");

        RandomAccessFile raf = new RandomAccessFile(outputFile, "r");

        raf.seek(start);

        output = response.getOutputStream();

        byte[] buffer = new byte[2096];

        int bytesRead = 0;

        int totalRead = 0;

        while (totalRead < contentLength) {

            bytesRead = raf.read(buffer);

            totalRead += bytesRead;

            output.write(buffer, 0, bytesRead);

        }

    }

} else {

    try (InputStream input = new FileInputStream(outputFile.getPath())) {

        response.setContentType("video/mp4");

        response.setHeader("Content-Disposition", "inline; filename=test.mp4");

        response.setStatus(200);

        output = response.getOutputStream();

        byte[] buffer = new byte[2096];

        int read;

        while ((read = input.read(buffer)) != -1) {

            output.write(buffer, 0, read);

        }

        output.flush();

        output.close();

    }

}


查看完整回答
反对 回复 2022-06-30
  • 2 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号