停滞中...

Nginxで複数のライブ配信サイトに同時配信しようというおはなし。

自前でRTMP配信をする場合は自家製RTMP+HLS配信のすすめ(その1)を参照。


概要

エンコーダー → Nginx → 各種ライブ配信サイト

エンコーダーはNginxへPushしてNginxが多重化して各サイトにPushする。

Nginx

えんじんえっくすと読むらしい。HTTPサーバー。モジュールを追加することでRTMP兼HLSサーバーとしても使えるすぐれもの。 フォルダに展開するだけで即使うことが出来て非常に軽量。

用意するもの

  • エンコーダー:RTMPをPushできるもの
    Flash Media Live Encoder、OBS、Xsplitなど
  • サーバー:Nginx 公式(ダウンロードについては次の項目を参照)

Nginxの入手

RTMPモジュール込みのWindows版ビルドがいくつか公開されているのでそれを利用する。

Nginxのセットアップ

  1. Nginx用フォルダを用意
    nginxという名前のフォルダを任意の場所に作成する。スペースと日本語を含まないパスならどこでもいい。ドライブ直下を推奨。
  2. 用意したフォルダに展開
    ダウンロードしたNginx圧縮ファイルを作成したフォルダに展開する。\nginx\nginx.exeとなるようにファイル群を移動させる。圧縮ファイルに含まれている空フォルダもきちんと展開されているか注意。

Nginxの起動と終了

NginxはコンソールアプリなのでWindowsを想定したGUIは一切無い。起動と終了はコマンドプロンプトから行うかbatやスクリプトを利用する。

コマンドプロンプトを使う場合

WSHスクリプトを使う場合

専用ツールを使う場合


起動してもタスクトレイにアイコンが表示されたりはしない 。正しく起動された場合はタスクマネージャーでプロセス一覧を見るとnginx.exeが2つ表示される。

Nginxが起動/終了できなくなったら


Nginxの設定

設定は\nginx\confフォルダにあるnginx.confをテキストエディタで編集することで行う。もしnginx.confファイルが存在しない場合は新規テキストで作成する。

準備

今回雛形として使う内容は次の通り。メモ帳などで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サーバーとしてのみ動作するようになる。

confの書き方

設定はコンテキスト(context)の中にディレクティブ(directive)という命令・規則を書くことで行う。コンテキストは{で始まり}で終わる。先の雛形では
events {
	worker_connections 1024;
}
の部分がeventsコンテキストで、真ん中の行のworker_connectionsがディレクティブ。1024はそのディレクティブの設定値。eventsもまたディレクティブの1つであり、あくまで{}で囲まれた部分がコンテキスト。

雛形ではこの下にrtmpコンテキストがありその中にserver、更にその中にapplicationコンテキストがある。今回はapplicationコンテキストを編集してエンコーダーから送られてきたストリームの再Push先を指定する。

Push先の指定

pushディレクティブを複数記述することで再Push先を指定する。
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の件については解決には至りませんでしたが、
この記事のおかげで他の配信サイトでは同時配信できるようになりました。
わざわざ実験して頂きありがとうございました!

0
Posted by 新木 2014年05月09日(金) 18:20:38 返信

テスト配信で実際に確認しました。
cavestream.netで試した直後はうまくいかなくて、10分ほど後にskr7.cavelis.netで試したところ正しく配信できました。何かしらのタイムアウト処理が関係しているのかもしれません。

0
Posted by jaijai 2014年05月02日(金) 20:43:16 返信

わざわざ試して頂きありがとうございます!
cavestream.netを使わずに下に書いてあるサーバーから選んでnginx.confの内容も書いて頂いた通りに変えたのですが、
同じ症状が出てしまいます。
色々なサーバーを試したのですが、どのサーバーでも配信できませんでした。
試されたということは配信には成功しているということでしょうか?
もし僕の環境によるものだったらすみません。

0
Posted by 新木 2014年05月02日(金) 15:04:56 返信

試してみました。

配信開始前画面の「配信サーバーの混雑状況」に表示されているサーバー一覧からサーバーを選んでください。
cavestream.netを使うといずれかのサーバーに転送されますがNginxのpushではこれに追従できないようです。

skr7の例
push rtmp://skr7.cavelis.net/ app=live playpath=12345675zkgsqkdwjfsffcz4;

0
Posted by jaijai 2014年05月02日(金) 13:50:57 返信

初めまして。
こちらの記事のおかげでtwitchとhitboxで同時配信ができました。
ありがとうございます!
ただ一つだけ問題がありまして、Cavetubeという配信サイトのみ配信ができません。
配信の開始を感知してページ移動はするのですが、
一瞬で配信が終了した扱いになってしまいます。
nginx.confでtwitchとhitboxとCavetubeを指定した場合と、
Cavetubeのみを指定した場合、両方とも同じ症状が出ます。
大変身勝手なお願いではありますが、
もし原因などが分かりましたら教えて頂けると嬉しいです。

0
Posted by 新木 2014年04月30日(水) 14:46:49 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

 

管理人/副管理人のみ編集できます