を転送しないで、私はビデオをストリーミングするNIOのチャネルを使用して、私のJavaサーブレット、内のコードのこのビットを持っている: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=1048576-
Response:
Accept-Ranges:bytes
Content-Disposition:inline; filename="SampleVideo.mp4"
Content-Length:7160
Content-Range:bytes 1048576-1055735/1055736
Content-Type:video/mp4
そして: これは、別の要求が送信される前に、残りのバイトのために転送されるようのみ64キロバイトを示し、上記のJavaコードが実行されているChromeブラウザ
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
からではなく、ブラウザ側の応答でありますこの場合、返されるデータ(7KB)は実際にContent-Lengthの量と一致します。この結果、ビデオの再生に失敗し、プレーヤーにエラーが表示されます。しかし、私がACCEPT-RANGESヘッダーを返さないと、ビデオは正常に再生されますが、ビデオの別の部分を探すことはできません。
これは小さいファイルの場合にのみ問題があるようです。< 10MBの範囲では、戻った量がコンテンツの長さの応答値と一致しなくても正常に動作するようです。非常に大きな動画の場合は、初回の応答で約35MBを返します。< 500MB。 Firefoxでは、ブラウザはChromeブラウザよりも多くの小さなGETリクエストを作成するようです。これがなぜこのように起こっているのか、実際にどれくらいの量が送信されるかをどのように確認するのかはわかりません。
私はバッファが読み込まれる最大量を知っています。上限は1830×32×1024バイトです。私の質問は、ブラウザが送信されたものを取得しない理由、それはすぐに待たずに別のGET要求を送信することです。 –