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

我有这个提供视频的 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();

}


哆啦的时光机
浏览 118回答 2
2回答

PIPIONE

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

慕姐4208626

如果有更好的实施,请分享。OutputStream output;if (request.getHeader("range") != null) {&nbsp; &nbsp; response.setStatus(206);&nbsp; &nbsp; String rangeValue = request.getHeader("range").trim().substring("bytes=".length());&nbsp; &nbsp; long fileLength = outputFile.length();&nbsp; &nbsp; long start, end;&nbsp; &nbsp; if (rangeValue.startsWith("-")) {&nbsp; &nbsp; &nbsp; &nbsp; end = fileLength - 1;&nbsp; &nbsp; &nbsp; &nbsp; start = fileLength - 1 - Long.parseLong(rangeValue.substring("-".length()));&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; String[] range = rangeValue.split("-");&nbsp; &nbsp; &nbsp; &nbsp; start = Long.parseLong(range[0]);&nbsp; &nbsp; &nbsp; &nbsp; end = range.length > 1 ? Long.parseLong(range[1]) : fileLength - 1;&nbsp; &nbsp; }&nbsp; &nbsp; if (end > fileLength - 1) {&nbsp; &nbsp; &nbsp; &nbsp; end = fileLength - 1;&nbsp; &nbsp; }&nbsp; &nbsp; if (start <= end) {&nbsp; &nbsp; &nbsp; &nbsp; long contentLength = end - start + 1;&nbsp; &nbsp; &nbsp; &nbsp; response.setHeader("Content-Length", contentLength + "");&nbsp; &nbsp; &nbsp; &nbsp; response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + fileLength);&nbsp; &nbsp; &nbsp; &nbsp; response.setHeader("Content-Type", "video/mp4");&nbsp; &nbsp; &nbsp; &nbsp; response.setHeader("Content-Disposition", "inline; filename=test.mp4");&nbsp; &nbsp; &nbsp; &nbsp; RandomAccessFile raf = new RandomAccessFile(outputFile, "r");&nbsp; &nbsp; &nbsp; &nbsp; raf.seek(start);&nbsp; &nbsp; &nbsp; &nbsp; output = response.getOutputStream();&nbsp; &nbsp; &nbsp; &nbsp; byte[] buffer = new byte[2096];&nbsp; &nbsp; &nbsp; &nbsp; int bytesRead = 0;&nbsp; &nbsp; &nbsp; &nbsp; int totalRead = 0;&nbsp; &nbsp; &nbsp; &nbsp; while (totalRead < contentLength) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bytesRead = raf.read(buffer);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; totalRead += bytesRead;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output.write(buffer, 0, bytesRead);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }} else {&nbsp; &nbsp; try (InputStream input = new FileInputStream(outputFile.getPath())) {&nbsp; &nbsp; &nbsp; &nbsp; response.setContentType("video/mp4");&nbsp; &nbsp; &nbsp; &nbsp; response.setHeader("Content-Disposition", "inline; filename=test.mp4");&nbsp; &nbsp; &nbsp; &nbsp; response.setStatus(200);&nbsp; &nbsp; &nbsp; &nbsp; output = response.getOutputStream();&nbsp; &nbsp; &nbsp; &nbsp; byte[] buffer = new byte[2096];&nbsp; &nbsp; &nbsp; &nbsp; int read;&nbsp; &nbsp; &nbsp; &nbsp; while ((read = input.read(buffer)) != -1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output.write(buffer, 0, read);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; output.flush();&nbsp; &nbsp; &nbsp; &nbsp; output.close();&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java