Потоковая передача видеофайла с java сервера на iPhone - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть этот сервлет Java, который обслуживает видео, он отлично работает в настольных и Android-браузерах, но в iPhone видео не отображается.

вот мой код сервлета.

    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 ]

0 голосов
/ 21 февраля 2019

Спасибо, @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();
    }
}
0 голосов
/ 21 февраля 2019

iPhone требует, чтобы сервер правильно обрабатывал запросы диапазона байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...