知ってることを自分の中で整理するためのメモです。
知ってることしか知らないしそこまで使い込んでないので、間違ってる可能性は多いにありです。
動画配信とライブ配信
- Webで動画を配信するには2つのパターンがある
- 完成した動画ファイルをまるっと取得して再生するか
- 動画ファイルの一部を「逐次」取得して再生する(ストリーミング)か
- クライアントサイドとしては、サーバーにあるメディアを逐次取得するだけなので、そういう意味での違いはない
- 今回の記事は後者の方法について
- Web = HTTPベースのストリーミング用にいくつかプロトコルがある
- HDS(= HTTP Dynamic Streaming)
- HLS
- SS(= Smooth Streaming)
- MPEG-DASH
- このうち、HLS / MPEG-DASHが最近の主流の2つ
- だいたい似たような仕組みになってて、ざっくりAdaptive Streaming技術とか言ったり
- RTSPとかRTMPがどうのこうのは、HTTPベースじゃないので割愛
Adaptive Streaming
- HLS/DASHも同じような仕組み
- まずプレイリストもといメタデータを取得
- そこに書いてある最適な細切れ動画を随時取得・再生していく
- 真の意味でAdaptiveに実装するにはjsだけではなくメディア側(サーバーサイド)でもいろいろ手を入れる必要があるし色々と大変
HLS
- Http Live Streamingの略で、Apple産
- 対応環境なら、`.m3u8`をvideo.srcに突っ込むだけで後はいい感じに動画を読み込んで再生してくれる
- http://caniuse.com/#feat=http-live-streaming
- Safariで直接使う場合、メディアによっては途中で止まったりすることがある(らしい)
DASH
MSE
- Media Source Extensionの略
- http://caniuse.com/#feat=mediasource
- HLSもDASHもフォーマットの構成がだいたい同じ
- 先述のとおり動画情報と細切れ動画セグメントから成る
- これらを使ってクライアントでStreamを組み上げて、videoのsrcにつっこめるAPI
- なのでHLSもDASHも原理上(!)は、これで再生できる
- APIはシンプル、つまり気合で頑張れ・・
- コードの感じは
コンテナとかコーデックとか
- 大事なのは拡張子ではなく中身
- 外箱(コンテナ)と内箱(コーデック)のイメージ
- MPEG-2 TSはコンテナ
- H.264/AVCはコーデック
- ライセンスの問題にも注意
- MPEG-DASH Royalties: What We Know So Far - Streaming Media Magazine
- これはDASHやけど、そういや`.mp3`にもそんな話があったな・・
ライブラリたち
- https://github.com/videojs/video.js
- https://github.com/dailymotion/hls.js
- https://github.com/Dash-Industry-Forum/dash.js
- ほかにも探せばいろいろある
- or 手書き
あらゆる環境(特にモバイル)で、安定的にあらゆるフォーマットをいい感じに再生したいなら、現段階では手書きするしかなさそう。
ただこのへんを手書きしてるであろう人は知ってるけど、並外れたスキルと莫大な時間が必要そうで、戦場は選ぶほうが賢明かなーという気持ち。
まぁなんしかどのライブラリも銀の弾丸ではなくて、要件に応じてあれこれハマるしかないように見える。
ストリーミングサーバー
割愛。
サーバーサイドでプレイリストや動画の細切れをエンコードする仕事。
まぁWebRTC関連と顔ぶれは似てる。
先駆者たち
これも割愛。
どこのサイトがどういう技術でアレしてコレしてるかもざっと調べたけど内緒。
界隈の悩みのタネ
想像です。
- 再生環境によってのRenderer選び
- どの仕様を使うのか、どの仕様なら動くのか
- いちおう動くけどCPU負荷がアレで長時間はままならんとか
- 遅延との戦い
- そもそもの配信遅延とか
- HTTPならではのDNS解決云々とか
- リアルタイム(数秒遅れないとは言ってない)とか
- 動画ファイル自体によるトラップあれこれ
- コンテナ詐欺とかコーデック詐欺とか
- `canPlayType()`は信用できるやつになったのだろうか
- 細切れにしすぎるとリクエストかさむけど、刻まないとダウンロードに時間食うとか
- モバイルで自動再生とかインライン再生したい問題
- というか横画面で固定したいよねとか
- 雑に`transform:rotate(90deg);`してアウアウするとか
- video要素すらブラックボックスに見えてくる問題
- canvasの方が楽と見せかけてやっぱキツいとか
- 生MSEはつらい問題
ちょっと想像してみただけでコレなので、たぶんやってみたら他にもいーーーーーっぱいあると思う。
苦しまない程度にやっていきたい・・な・・・。