私は<video>
と<audio>
要素を持っています(ファイルのmp4、mp3は関係ありません)。HTML5ビデオ要素が終了要求しません範囲
しかし、要素は私のサーバーからエンド範囲のみを要求し、そこからはバイト0からエンドまで直接ストリームを試み、プレイヤーを「ダウンロードループ」に陥らせようとします。ダウンロードが完了するまで、ブラウザは他のすべてのアクションを中断します。
誰もがこの問題の解決策を知っていますか?たとえば、私のストリームリクエストの実際の終了がcontent length
またはaccept-ranges
になるようにする必要がありますか?
Chromeのリクエストリストはすべてここにあります。view?watch=v__AAAAAA673pxX
というURLのリクエストは、基本的には、element
によって新しいリクエストが送信されるまで保留されています。一言で言えば
:HTML5の要素がhttp-range
要求を使用している場合、ダウンロードループに陥っし、「保留」に滞在する他のすべての要求を引き起こします。
UPDATE
問題は、サーバー側に解決されました。
元のストリーム関数は文字通りすべてのバイトを出力しますが、実際のバッファのサイズだけを出力するようにコードを修正しました。これにより、elements
は残りのデータを新しい要求するようになります。ここ
重要な注意点は、各HTTP RANGE
要求で開始位置と終了、ファイルのサイズに合わせcontent-length
、accept-ranges
とcontent-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();
}
あなたは正しいです。残念ながら、提供されたコードはリクエストにデータを出力するために 'while'ループを使用していました。私は、バッファサイズが出力されるように(例えば(1024 * 1024))、バッファサイズに達するとすぐに出力ストリームが閉じられるようにしました。 これにより、提供されたデータが 'Content-Length'ヘッダと一致しないため、'