对于我正在处理的项目,我在服务器上有一些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视频文件根本无法播放。希望有人知道为什么会这样,以及如何解决它。