2 回答

TA貢獻1811條經驗 獲得超6個贊
范圍包括開始到結束。不是起始長度
例如:
Content-range: bytes 0-0/31491166
返回 1 個字節(從字節零到字節零)
您的代碼不起作用,因為瀏覽器正在等待一個從未發送過的字節。

TA貢獻1784條經驗 獲得超7個贊
使用下面的代碼片段。它在所有瀏覽器Safari、Firefox 和 Chrome上運行和測試。
protected byte[] prepareContent(final HttpHeaders headers, byte[] media,
String range) throws IOException {
long rangeStart = 0;
long rangeEnd;
long fileSize = media.length;
String[] ranges = range.split("-");
rangeStart = Long.parseLong(ranges[0].substring(6));
if (ranges.length > 1) {
rangeEnd = Long.parseLong(ranges[1]);
} else {
rangeEnd = fileSize - 1;
}
if (fileSize < rangeEnd) {
rangeEnd = fileSize - 1;
}
String contentLength = String.valueOf((rangeEnd - rangeStart) + 1);
headers.add("Content-Length", contentLength);
headers.add("Content-Range", "bytes " + rangeStart + "-" + rangeEnd + "/" + fileSize);
headers.add("Content-Type", "video/mp4");
headers.add("Accept-Ranges","bytes");
return readByteRange(media, rangeStart, rangeEnd);
}
private byte[] readByteRange(byte[] media, long start, long end) throws IOException {
try (InputStream inputStream = new ByteArrayInputStream(media);
ByteArrayOutputStream bufferedOutputStream = new ByteArrayOutputStream()) {
int nRead;
while ((nRead = inputStream.read(media, 0, media.length)) != -1) {
bufferedOutputStream.write(media, 0, nRead);
}
bufferedOutputStream.flush();
byte[] result = new byte[(int) (end - start) + 1];
System.arraycopy(bufferedOutputStream.toByteArray(), (int) start, result, 0, result.length);
return result;
}
}
添加回答
舉報