読者です 読者をやめる 読者になる 読者になる

MPEG‐DASHにおけるHTTP/2の使用、DASH-PUSHの提案

MPEG-DASHとHTTP/2

MPEG-DASH(Dynamic Adaptive Streaming over HTTP)と呼ばれるHTTP上で環境に合わせてビットレートを変更しながらストリーミングできる仕組みがある。このMPEG-DASHにHTTP/2を使うという話がいくつか出てきている。


たとえば、BBCの「Adaptive Media Streaming over HTTP/2 Trial」、やCanon Research Centre Franceの「DASH fast start using HTTP/2」 といった試みがある。


先日、「DASH and HTTP2(draft-ruellan-httpbis-dash-http2-00)」というMPEG-DASHにHTTP/2のサーバプッシュをうまく使うためにDASH-PUSHというヘッダを定義する提案が出てたので軽く目を通した。(スライドも合わせて)


(Pushを用いた場合とそうでない場合の比較は、上記Canon Research Centre Franceの論文で詳しく触れられている)

DASH and HTTP2

ライブ映像のストリーミングでDASHを使う場合、セグメントを決めるのにトレードオフが発生する。
短いセグメントを使う場合、ストリーミングに大切なレイテンシは低くなる。しかし、リクエスト回数は増えることになりネットワークパフォーマンス悪影響を及ぼしうる。


「Low Latency Live Video Streaming over HTTP 2.0」(NOSSDAV 2014, 2014)の中では、この問題を解決するために以下の方法を提案している。
ライブ映像は短く分割し、クライアントがセグメントをリクエストした際にサーバはそのセグメントだけでなく続くセグメントも一緒にプッシュする方法である。これによりリクエスト数を少なく保ちながら少ないレイテンシを維持できる。


クライアントがストリーミングを制御できるように、クライアントはサーバにプッシュしてもらいたいセグメントの数(_k_)を決め、リクエスト時にサーバに送信できるようにする。
その時に使用するDASH-PUSHというヘッダを新しく定義する。

DASH-PUSH

HTTP/2のServerPushの利点を使用するために、DASH-PUSHというヘッダを使用してクライアントの要求をサーバに伝える。

Pushing next _K_ segments

リクエストしたセグメントに続く _k_ 個のセグメントをプッシュされる。
リクエストに続く5個のセグメントをプッシュするように伝える場合は以下のようになる

"DASH-PUSH: type=push-next; K=5"
Pushing for _T_ seconds

指定された時間に対応するセグメントがプッシュされる。
例えばリクエストに続く10秒のセグメントをプッシュするように伝える場合は以下のようになる

"DASH-PUSH: type=type=push-time; T=10"

他の提案

DASH-PUSHを拡張し、さらなる指定方法を幾つか提案しています。

Using a list of URIs

リスト化したリソースすべてのセグメントがサーバによってプッシュされます。

"DASH-PUSH: type=uri-list; seg-1.mp4; seg-2.mp4; seg-3.mp4"
Using a URI template:

上記と同じ例で、テンプレートと変数(レンジとして)表現することが出来ます。

"DASH-PUSH: type=uri-template; seg-{1}.mp4; 1 : 2 : 3"
"DASH-PUSH: type=uri-template; seg-{1}.mp4; { 1 - 3 }"

また、複数指定も出来ます

"DASH-PUSH: type=uri-template; seg-rep-{1}-{2}.mp4; R1 : R2; { 1 - 3 }"
Using a URI wildcard

URIのリストを指定する代わりにワイルドカードを使用できます。対応するメディアタイプなどのリソースのプッシュできます。

"DASH-PUSH: type=uri-wildcard; text/css"
Header field value

DASH-PUSHヘッダはリソースのURIの指定にのみ制限されません。別のヘッダ値のものも指定できます。
例えば、別のレンジのものをプッシュするように伝えることも出来ます。

"DASH-PUSH: type=header; Range; 501-1000; 1001-1500"