2013-08-12 6 views
8

範囲要求を受け入れるサーバーでホストされているビデオのHTML5ビデオを再生する場合、ビデオのバッファされていない部分を先取りしようとすると、ブラウザが行うネットワークトラフィックがわかりますバイト範囲要求。私は前もって総ビデオサイズを知って、一定のビットレートを仮定してブラウザがバイトを計算していると仮定しています(プログレスバーの途中をクリックすると、半分の点でバイトが要求されます)。しかし、特にビデオのビットレートが可変であれば、それが要求するバイトが実際にユーザがクリックした時点に対応する可能性は低いと思われ、バイトはおそらくフレームの中央に位置する可能性があります。HTML5ビデオのバイト範囲リクエスト(擬似ストリーミング)はどのように機能しますか?

ブラウザは次のフレームの開始点を知っていますか?一度任意のバイトでフェッチを開始したらどうなりますか?

+0

私は以下の質問に答えようとしました。 – woofmeow

答えて

9

私はあなたのビデオはMP4コンテナであると仮定します。 mp4ファイル形式には、「ボックス」の階層構造が含まれています。これらのボックスの1つは、Time-To-Sample(stts)ボックスです。このボックスには、すべてのフレームの時間が(コンパクトに)格納されます。ここから、サンプルからチャンク(stsc)アトムを使ってフレームを含む 'チャンク'を見つけることができます。最後にチャンクオフセットアトム(stco)は、バイトオフセットをファイルに与えます。

ムービーの合計所要時間は、ムービーヘッダーアトム(mvhd)に格納されます。スクラブハンドルを移動すると、ムービーの長さに基づいて時間が推定され、スクラブハンドルを放して、以前にダウンロードしたファイルヘッダーから計算が行われ、要求が行われます。

編集: mp4でない場合、他のコンテナにも同様のメカニズムがあります。コーデックは無関係です。

+0

この回答は私にとって最も説得力がありますが、私はこれがブラウザが実際に行っている方法であると完全には確信していません。私はそれがこのようにすることができることに完全に同意する。明確にするために、私はこのブログを参考にしました:http://thompsonng.blogspot.com/2010/11/mp4-file-format.html あなたが言っていることが正しいなら、超大型ビデオ可変ビットレートで、完全に正確でなければなりませんか?また、ブラウザーがmoovアトム(stts、stsc、stcoデータ)を使ってシークしていることを証明する参照はありますか? – bhh1988

+0

個人的に私はソースに直接行きたい。それはISC/IEC 14496-12です。または、古い「QuickTime File Format」ドキュメント。はい、私はmp4でシークする唯一の方法であるので、ブラウザがmp4のためにそれを行う方法であると確信しています。 – szatmary

+0

オーディオチャンクとビデオチャンクは、1つのチャンクが停止し、別のチャンクが開始されたときに表示されずにインターリーブされるため、mdatを処理することはできません。唯一のドキュメントはブラウザのソースコードです。各ブラウザでは、ある種のメディア抽象化が使用される可能性が高いことに注意してください。したがって、ブラウザは単にseekToTime()を呼び出し、メディアレイヤーはどのHTTP要求を送信する必要があるかを判断します。 – szatmary

-1

MPEGなどの多くのビデオ/メディアタイプは、固定された同じパケットでエンコードされています。

MPEGはもともと188バイトのパケット(元々はATMトランスポートレイヤの8セルに選ばれましたが、現在は廃止されています)で設計されています。したがって、その188バイトの倍数を求める場合、フレームの先頭が見つかると有効なパケット&を復元します。

ブラウザ/プレーヤーが他のフレームとは独立してデコードできるIフレーム(またはキーフレーム)に達すると、実際の画像を表示できます。 P-フレームとB-フレームは補間なので、それらを探してもまだ画像を作ることはできません。

参照:

+0

h.264についてはどうですか?また、どのようにフレームに収まるかはわかりません。リクエストがフレームの途中からパケットを取得した場合はどうなりますか?再生を適切に継続できるように、フレーム境界がどこにあるかをどのように知っていますか? – bhh1988

+0

フレームはマークされているので、パケットストリームをシークして同期を回復することができます。プレーヤは通常、「完全な画像」フレームが始まるまで読みとり、スキップします。パケットサイズを調べたい場合は、Google H.264をご利用ください。 –

+0

正しくありません。 HTTPライブストリーミングのみがトランスポートストリームを使用します。 HLSでは、時刻の位置決めはマニフェスト(m3u8)ファイルによって決定され、セグメント全体がダウンロードされます。バイト範囲はありません。 – szatmary

関連する問題