2017-10-06 4 views
0

を転送しないで、私はビデオをストリーミングする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リクエストを作成するようです。これがなぜこのように起こっているのか、実際にどれくらいの量が送信されるかをどのように確認するのかはわかりません。

答えて

0

read()は一度に1バイトを読みません。だからendByte += 1;はナンセンスです。読み取った金額は戻り値として使用できます。 endByte += count;である必要があります。countは、肯定の場合はreadの戻り値、それ以外の場合はゼロです。

+0

私はバッファが読み込まれる最大量を知っています。上限は1830×32×1024バイトです。私の質問は、ブラウザが送信されたものを取得しない理由、それはすぐに待たずに別のGET要求を送信することです。 –

関連する問題