从URL Source将MP4文件输出到Servlet

时间:2015-07-31 09:26:07

标签: java servlets video mp4

对于我正在处理的项目,我在服务器上有一些MP4视频文件。 我正在编写的基于Java的Web应用程序需要在浏览器中播放这些文件。由于安全限制,只有托管Web应用程序的服务器才能访问此服务器,使用Web应用程序的浏览器无法访问,因此无法使用HTML 5进行回放。

我正在处理的解决方案是拥有一个servlet(坐在Web应用服务器上),访问视频文件。将视频写为输出,并将servlet作为HTML播放器的源。

但是我似乎无法以流方式成功将视频文件输出为servlet输出。

我做了大量的研究。我最接近解决方案的是:

private static final int BUFFER_LENGTH = 1024 * 16;
private static final long EXPIRE_TIME = 1000 * 60 * 60 * 24;
private static final Pattern RANGE_PATTERN = Pattern.compile("bytes=(?<start>\\d*)-(?<end>\\d*)");

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    URL video = new URL("http://localhost/App/Videos/FileSD.mp4");
    URLConnection yc = video.openConnection();
    yc.setDoOutput(true);

    int length = yc.getContentLength();
    int start = 0;
    int end = length - 1;

    int contentLength = end - start + 1;

    response.reset();
    response.setBufferSize(BUFFER_LENGTH);
    response.setHeader("Accept-Ranges", "bytes");
    response.setDateHeader("Last-Modified", yc.getLastModified());
    response.setDateHeader("Expires", System.currentTimeMillis()
           + EXPIRE_TIME);
    response.setContentType(yc.getContentType());
    response.setHeader("Content-Range",
            String.format("bytes %s-%s/%s", start, end, length));
    response.setHeader("Content-Length", String.format("%s", contentLength));
    response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

    ReadableByteChannel input = Channels.newChannel(yc.getInputStream());

    int bytesRead;
    int bytesLeft = contentLength;
    ByteBuffer buffer = ByteBuffer.allocate(BUFFER_LENGTH);

    try (OutputStream output = response.getOutputStream()) {

        while ((bytesRead = input.read(buffer)) != -1 && bytesLeft > 0) {
            buffer.clear();
            output.write(buffer.array(), 0,
                    bytesLeft < bytesRead ? bytesLeft : bytesRead);
            bytesLeft -= bytesRead;
            output.flush();
        }
        output.close();
        input.close();
    }
}

在大多数情况下,此代码工作正常,它将URL作为输入,并将其作为输出流。问题是,它只适用于高清视频文件。 SD视频文件根本无法播放。希望有人知道为什么会这样,以及如何解决它。

0 个答案:

没有答案