2017-10-06 39 views
0

我有这段代码在我的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请求。不知道为什么会发生这种情况,或者我如何检查实际发送的数据量有多少

回答

0

read()一次不读取一个字节。所以endByte += 1;是无稽之谈。它读取的数量可用作返回值。它应该是endByte += count;其中count是由read返回的值,如果是正值,否则为零。

+0

我知道,这是读取缓冲区的最大次数,它的上限为1830 * 32 * 1024个字节。我的问题是为什么浏览器没有得到所传输的内容,它立即发送另一个GET请求而无需等待。 –