Nginxで複数のライブ配信サイトに同時配信しようというおはなし。
自前でRTMP配信をする場合は自家製RTMP+HLS配信のすすめ(その1)を参照。
自前でRTMP配信をする場合は自家製RTMP+HLS配信のすすめ(その1)を参照。
えんじんえっくすと読むらしい。HTTPサーバー。モジュールを追加することでRTMP兼HLSサーバーとしても使えるすぐれもの。
フォルダに展開するだけで即使うことが出来て非常に軽量。
- エンコーダー:RTMPをPushできるもの
Flash Media Live Encoder、OBS、Xsplitなど - サーバー:Nginx 公式(ダウンロードについては次の項目を参照)
RTMPモジュール込みのWindows版ビルドがいくつか公開されているのでそれを利用する。
- RJ - Designs and stuff: nginx rtmp
Rar-file: (compiled exe and folder structure)に並んでいるなかで一番数字の大きいものをDL(2014.06.05時点ではnginx 1.7.1 rtmp 1.1.4)。 - http://nginx-win.ecsds.eu/
もし先のサイトが利用できない場合はこっち。ベータではない最新っぽいやつをDL。
- Nginx用フォルダを用意
nginxという名前のフォルダを任意の場所に作成する。スペースと日本語を含まないパスならどこでもいい。ドライブ直下を推奨。 - 用意したフォルダに展開
ダウンロードしたNginx圧縮ファイルを作成したフォルダに展開する。\nginx\nginx.exeとなるようにファイル群を移動させる。圧縮ファイルに含まれている空フォルダもきちんと展開されているか注意。
今回雛形として使う内容は次の通り。メモ帳などでnginx.confを開き既存の内容はすべて削除した後にコレをコピペする。
#user nobody; worker_processes 1; error_log logs/error.log crit; events { worker_connections 1024; } rtmp { server { listen 1935; access_log logs/rtmp_access.log; ping 30s; ping_timeout 10s; drop_idle_publisher 15s; application multi { live on; meta copy; wait_video on; allow publish 127.0.0.1; allow publish 192.168.0.0/16; allow publish 172.16.0.0/12; allow publish 10.0.0.0/8; deny publish all; allow play 127.0.0.1; allow play 192.168.0.0/16; allow play 172.16.0.0/12; allow play 10.0.0.0/8; deny play all; #Twitch.tv (Asia: Singapore) #push rtmp://live-sin-backup.justin.tv/app/live_12345678_645txkSaSiUWZUhf2uDh2P19EgKOZ9; #Twitch.tv (US West: San Francisco) #push rtmp://live.justin.tv/app/live_12345678_645txkSaSiUWZUhf2uDh2P19EgKOZ9; #Ustream #push rtmp://x.xxxxxxxx.fme.ustream.tv app=ustreamVideo/xxxxxxxx playpath=RTkwwTnVPhDqjTTe5ywUfZERspWhWfbQ; #Youtube #push rtmp://a.rtmp.youtube.com/live2/RTkwwTnVPhDqjTTe5ywUfZERspWhWfbQ; #CaveTube #push rtmp://skr7.cavelis.net/ app=live playpath=7xov5pekr5zkgsqkdwjfsffco4; } } }ちなみに、このconfではNginxのHTTPサーバー部分は全く稼働せずRTMPサーバーとしてのみ動作するようになる。
設定はコンテキスト(context)の中にディレクティブ(directive)という命令・規則を書くことで行う。コンテキストは{で始まり}で終わる。先の雛形では
雛形ではこの下にrtmpコンテキストがありその中にserver、更にその中にapplicationコンテキストがある。今回はapplicationコンテキストを編集してエンコーダーから送られてきたストリームの再Push先を指定する。
events { worker_connections 1024; }の部分がeventsコンテキストで、真ん中の行のworker_connectionsがディレクティブ。1024はそのディレクティブの設定値。eventsもまたディレクティブの1つであり、あくまで{}で囲まれた部分がコンテキスト。
雛形ではこの下にrtmpコンテキストがありその中にserver、更にその中にapplicationコンテキストがある。今回はapplicationコンテキストを編集してエンコーダーから送られてきたストリームの再Push先を指定する。
pushディレクティブを複数記述することで再Push先を指定する。
ほとんどのライブ配信サイトではRTMPサーバーとしてアプリケーション名込みのアドレスが提示されるのでこれをそのまま使う。
例えばTwitch.tvなら
さらに
confファイルでは行の先頭に文字#があるとその行はコメント行とみなされ無視される(空白行として解釈される)。なので、雛形のpushディレクティブはすべてコメント行なのでPush先は何も指定されていない。このままエンコーダーからストリームをPushしてもNginxは何もしない(ストリームは受け取ってくれる)。
Twitch.tvといくつかのサイトは雛形に用意してあるので、コメント行を解除(行頭の#を削除)してストリームキーとサーバーアドレスを必要に応じて書き換える。行末には;が必須なので忘れないように注意。
変更できたらファイル保存してNginxを起動する。すでに起動中ならリロードする。もしconfの書き方に間違いがあるならエラーで起動しない。
- pushディレクティブの書式
push rtmp://サーバーアドレス/ app=アプリケーション名 playpath=プレイパスまたはストリームキー
ほとんどのライブ配信サイトではRTMPサーバーとしてアプリケーション名込みのアドレスが提示されるのでこれをそのまま使う。
例えばTwitch.tvなら
push rtmp://live.justin.tv/app playpath=live_12345678_645txkSaSiUWZUhf2uDh2P19EgKOZ9;と
push rtmp://live.justin.tv app=app playpath=live_12345678_645txkSaSiUWZUhf2uDh2P19EgKOZ9;は同じ意味。
さらに
push rtmp://live.justin.tv/app/live_12345678_645txkSaSiUWZUhf2uDh2P19EgKOZ9;も同じ意味になる。NginxのRTMPモジュールは最後の/より右側は自動的にストリームキーとして解釈してくれる。
confファイルでは行の先頭に文字#があるとその行はコメント行とみなされ無視される(空白行として解釈される)。なので、雛形のpushディレクティブはすべてコメント行なのでPush先は何も指定されていない。このままエンコーダーからストリームをPushしてもNginxは何もしない(ストリームは受け取ってくれる)。
Twitch.tvといくつかのサイトは雛形に用意してあるので、コメント行を解除(行頭の#を削除)してストリームキーとサーバーアドレスを必要に応じて書き換える。行末には;が必須なので忘れないように注意。
変更できたらファイル保存してNginxを起動する。すでに起動中ならリロードする。もしconfの書き方に間違いがあるならエラーで起動しない。
- RTMPサーバー:rtmp://localhost/multi
- プレイパス/ストリームキー:空白もしくは任意の文字列
(実際に使われるストリームキーはNginx設定にて行う)
- Nginxまで配信が正しく届いているのか確認するにはRTMPを直接見れるメディアプレイヤー(VLCプレイヤーなど)でrtmp://localhost/multiを開くと確認できる。
- Nginxから再送先までの接続は配信ごとに行われる。配信停止すると各サイトへの接続も終了する。
- 手間を減らしたいならnginx.exeのショートカットをWindowsスタートアップに登録しておく。
- 複数の再送先を切り替えて使いたい場合は別の名前でapplicationコンテキストを作成しエンコーダ側でapplication名を指定するのが楽。
- Ustreamではアプリケーション名はappオプションで必ず指定する必要がある。
タグ
このページへのコメント
CaveTubeの運営さんに問い合わせた結果、
『nginxのrtmpリレーに関しては現在サポートしていません。
将来的にサポートを行う可能性はありますが、現時点では予定していません。
恐れ入りますが、同時配信される場合は他の手段をご利用ください。』とのことでした。
CaveTubeの件については解決には至りませんでしたが、
この記事のおかげで他の配信サイトでは同時配信できるようになりました。
わざわざ実験して頂きありがとうございました!
テスト配信で実際に確認しました。
cavestream.netで試した直後はうまくいかなくて、10分ほど後にskr7.cavelis.netで試したところ正しく配信できました。何かしらのタイムアウト処理が関係しているのかもしれません。
わざわざ試して頂きありがとうございます!
cavestream.netを使わずに下に書いてあるサーバーから選んでnginx.confの内容も書いて頂いた通りに変えたのですが、
同じ症状が出てしまいます。
色々なサーバーを試したのですが、どのサーバーでも配信できませんでした。
試されたということは配信には成功しているということでしょうか?
もし僕の環境によるものだったらすみません。
試してみました。
配信開始前画面の「配信サーバーの混雑状況」に表示されているサーバー一覧からサーバーを選んでください。
cavestream.netを使うといずれかのサーバーに転送されますがNginxのpushではこれに追従できないようです。
skr7の例
push rtmp://skr7.cavelis.net/ app=live playpath=12345675zkgsqkdwjfsffcz4;
初めまして。
こちらの記事のおかげでtwitchとhitboxで同時配信ができました。
ありがとうございます!
ただ一つだけ問題がありまして、Cavetubeという配信サイトのみ配信ができません。
配信の開始を感知してページ移動はするのですが、
一瞬で配信が終了した扱いになってしまいます。
nginx.confでtwitchとhitboxとCavetubeを指定した場合と、
Cavetubeのみを指定した場合、両方とも同じ症状が出ます。
大変身勝手なお願いではありますが、
もし原因などが分かりましたら教えて頂けると嬉しいです。