2017-01-07 12 views
1

私は<video><audio>要素を持っています(ファイルのmp4、mp3は関係ありません)。HTML5ビデオ要素が終了要求しません範囲

しかし、要素は私のサーバーからエンド範囲のみを要求し、そこからはバイト0からエンドまで直接ストリームを試み、プレイヤーを「ダウンロードループ」に陥らせようとします。ダウンロードが完了するまで、ブラウザは他のすべてのアクションを中断します。

Range request 1

Range request 2

誰もがこの問題の解決策を知っていますか?たとえば、私のストリームリクエストの実際の終了がcontent lengthまたはaccept-rangesになるようにする必要がありますか?

Chromeのリクエストリストはすべてここにあります。view?watch=v__AAAAAA673pxXというURLのリクエストは、基本的には、elementによって新しいリクエストが送信されるまで保留されています。一言で言えば

Full range request history

:HTML5の要素がhttp-range要求を使用している場合、ダウンロードループに陥っし、「保留」に滞在する他のすべての要求を引き起こします。

UPDATE

問題は、サーバー側に解決されました。

元のストリーム関数は文字通りすべてのバイトを出力しますが、実際のバッファのサイズだけを出力するようにコードを修正しました。これにより、elementsは残りのデータを新しい要求するようになります。ここ

重要な注意点は、各HTTP RANGE要求で開始位置と終了、ファイルのサイズに合わせcontent-lengthaccept-rangescontent-rangesを返すことです。

function stream(){ 
    $i = $this->start; 
    set_time_limit(0); 
    while(!feof($this->stream) && $i <= $this->end) { 
     $bytesToRead = $this->buffer; 
     if(($i+$bytesToRead) > $this->end) { 
      $bytesToRead = $this->end - $i + 1; 
     } 
     $data = fread($this->stream, $bytesToRead); 
     echo $data; 
     flush(); 
     $i += $bytesToRead; 
    } 
} 

新しいストリーム機能:将来の参照の場合

function stream() 
{ 
    //added a time limit for safe-guarding 
    set_time_limit(3); 
    echo fread($this->stream, $this->offset); 
    flush(); 
} 

答えて

1

は、ビデオ用のとき、ブラウザ要求、それはこのようなヘッダを送信する最初の時間あなたは1Mバイト のビデオを持っていると仮定

Host:localhost 
Range:bytes=0- 

範囲ヘッダーbytes=0-ブラウザが返すことができるものを返すことをブラウザが要求していることを意味します。終了位置は、このサーバに

を指定されているいかなる通常範囲の文脈

Accept-Ranges:bytes 
Content-Length:99999 
Content-Range:bytes 0-99999/1000000 

を維持するために最後のバイトを除いて、ファイル全体を返信しないでしょう今、あなたの動画が30%までダウンロードされ、あなたが70%にブラウザを求めるとしパートヘッダは、

要素だけで私のサーバーからエンドレンジを要求していることが思わこの

Host:localhost 
Range:bytes=700000- 

ようになることを要求します10

あなたはそれが今、サーバは、それが明示的にそれはあなたのことを私の推測の.soファイルのどの部分を告げる

Accept-Ranges:bytes 
Content-Length:300000 
Content-Range:bytes 700000-99999/1000000 

Content-Rangeのように返信可能性があるビデオパート

の開始位置です誤って推論見ることができますサーバーはこの情報を送信しておらず、ブラウザは盗聴されています。 mime-typesもまた、ファイルの正確なMIMEタイプをContent-Type: video/mp4のように使用することがあります。Content-Type: application/octet-streamを使用すると、圧縮され、範囲ヘッダーが無効になる可能性があります。

+0

あなたは正しいです。残念ながら、提供されたコードはリクエストにデータを出力するために 'while'ループを使用していました。私は、バッファサイズが出力されるように(例えば(1024 * 1024))、バッファサイズに達するとすぐに出力ストリームが閉じられるようにしました。 これにより、提供されたデータが 'Content-Length'ヘッダと一致しないため、'

関連する問題