我有这段代码在我的Java Servlet,它使用NIO渠道的视频流:的Java HTTPServlet的OutputStream中不传输的所有数据
int bufferSize = 32 * 1024;
os = response.getOutputStream();
in = Channels.newChannel(contentStream);
out = Channels.newChannel(os);
ByteBuffer buffer = ByteBuffer.allocateDirect(bufferSize);
while (in.read(buffer) > -1 || buffer.position() > 0) {
endByte += 1;
buffer.flip();
out.write(buffer);
buffer.compact();
if(endByte == 1830)
break;
}
如果字节范围请求我将寻求使用缓冲和然后从请求的开始字节开始流式传输。 这是从浏览器的浏览器
GET/Request:
Accept:*/*
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Range:bytes=0-
Response:
Accept-Ranges:bytes
Content-Disposition:inline; filename="SampleVideo.mp4"
Content-Length:1055736
Content-Type:video/mp4
上面的Java代码运行,但是,从浏览器端只有64KB所示为传送被发送另一个请求之前的剩余字节的响应:
GET/Request:
Accept:*/*
Accept-Encoding:identity;q=1, *;q=0
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Range:bytes=1048576-
Response:
Accept-Ranges:bytes
Content-Disposition:inline; filename="SampleVideo.mp4"
Content-Length:7160
Content-Range:bytes 1048576-1055735/1055736
Content-Type:video/mp4
而在这种情况下,返回的数据(7KB)确实与Content-Length中的数量相匹配。这会导致视频播放失败,播放器显示错误。但是,如果我没有返回ACCEPT-RANGES标头,则视频播放正常,但不允许我寻找视频的其他部分。
这似乎只是一个小文件的问题< 10MB一旦它的30MB范围内它似乎工作正常,即使返回的数量不匹配内容长度响应值。有时对于非常大的视频< 500MB,第一个响应会返回大约35MB。在Firefox上,浏览器似乎比Chrome浏览器产生了很多小的GET请求。不知道为什么会发生这种情况,或者我如何检查实际发送的数据量有多少
我知道,这是读取缓冲区的最大次数,它的上限为1830 * 32 * 1024个字节。我的问题是为什么浏览器没有得到所传输的内容,它立即发送另一个GET请求而无需等待。 –