从java服务器到iPhone的视频文件流

从java服务器到iPhone的视频文件流,java,servlets,video-streaming,Java,Servlets,Video Streaming,我有一个java servlet服务于视频,它在桌面和Android浏览器中运行良好,但在iPhone中不显示视频 这是我的servlet代码 OutputStream output; try (InputStream input = new FileInputStream(videoPath)) { response.setContentType("video/mp4"); response.setHeader("Content-Disposition", "i

我有一个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();
}

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

谢谢,@szatmary的指导这里是实施方案,如果有更好的实施方案,请分享

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();
    }
}
OutputStream输出;
if(request.getHeader(“range”)!=null){
答复:setStatus(206);
字符串rangeValue=request.getHeader(“range”).trim().substring(“bytes=“.length());
long fileLength=outputFile.length();
漫长的开始,漫长的结束;
if(rangeValue.startsWith(“-”){
end=fileLength-1;
start=fileLength-1-Long.parseLong(rangeValue.substring(“-”.length());
}否则{
字符串[]范围=rangeValue.split(“-”);
start=Long.parseLong(范围[0]);
end=range.length>1?Long.parseLong(range[1]):fileLength-1;
}
如果(结束>文件长度-1){
end=fileLength-1;
}

如果(开始)感谢回复,您能否解释更多关于您的答案以及我应该对服务器端代码做哪些更改。在请求中查找范围标头,设置回复范围标头,返回206并发送所请求范围的字节