まず始めに言うと、Flashなプレイヤーに対してRTMPで配信するのが一番低遅延で安定してると思います。Flashなんて嫌だ!そして宗教上の理由でHLSも嫌だ!そして低遅延じゃないと嫌だ!という欲張り兄貴に贈るMPEG-DASHの唄。
nginx-rtmp-moduleを入れたnginxを使って普通に配信サーバーがある人向け情報なので、まだ無い人はググって構築なさってくださいオナシャス!
nginxの設定内容:
1 2 3 4 |
dash on; dash_path live/dash; dash_fragment 500ms; dash_playlist_length 4s; |
をapplication ***{}の中に入れましょう。
dash_fragmentとdash_playlist_lengthがクッソ重要で、前者が動画ファイル分割時間、後者が動画ファイルをリストに載せておく時間。これらを短くすると配信遅延も短くなるのだけれど、短くし過ぎると不安定になってしまうので適宜調整。おじさんの環境だと前述くらいでちょうどいい。
dash_pathは動画ファイルを置いておく場所。
あと配信ソフト(OBSとか)の側でも設定が必要で、なるべくキーフレーム間隔を短く(できれば0.5秒、せめて1秒)にしましょう。しないと再生できないことが多いっぽい(適当)
一応HTMLソースも載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<html> <head> <title>MPEG-DASH-TEST</title> <style> video { width: 1280px; height: 720px; } </style> </head> <body> <div> <video id="videoPlayer" controls></video> </div> <script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script> <script> (function(){ var url = "dash/なんとか.mpdみたいな感じでmpdファイルのURL"; var player = dashjs.MediaPlayer().create(); player.initialize(document.querySelector("#videoPlayer"), url, true); })(); </script> </body> </html> |
みたいな感じで作って、どうぞ。
ほぼdash.js公式サンプルコードのままなのでそっち見た方がよいかも(ガバガバ)。
肝心の遅延はどれくらいかというと…
速いときでFlashは1秒ちょっと、DASHは3秒ちょっとくらい(ブラウザでミリ秒時計を表示したのを配信して適当にスクショ)。MPEG-DASHはブラウザの取得タイミングによって遅延が前後するけどなんとか3-4秒になりました。HLSは頑張って7秒くらいと記憶してるので結構縮まった、やったぜ。
みんなもMPEG-DASHしよう!
どうでもいい話、本当はメジャーそう(適当)なHLSで低遅延目指そうとしてたんだけど、Flashとの差がエグいのと、PCやAndroidで対応してないもしくは見づらい(おじさんの技術が足りないかもしれない)のがネックだった。
MPEG-DASH使ってみたら、PCでも泥でも再生できる、ただしiOSはダメwみたいな状況になった、やったぜ。でもFirefoxだと低遅延チューニングでかなり不安定なのでchrome推奨。
あとは動画ファイルをRAM Diskに置くとかの工夫で更に低遅延化出来ないかやってみたいと思いまぁす!