从 java 服务器流式传输到 iPhone 的视频文件
Video file streaming from java server to 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();
}
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();
}
}
我有这个提供视频的 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();
}
}