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

とある技術者のお遊びフライト日記

ゲームをきっかけに国内飛び回る謎な人の日記。時々技術ネタもご提供。

Linuxとフリーソフトでライブ動画配信サーバーを構築する

技術系ネタ

C++ RTMP Server(crtmpserver)でRTMPサーバを構築し、ニコ生やCaveTubeなどのようなライブストリーミング動画配信を、独自にできるようにする方法です。
設定手順はできるだけ簡潔になるように紹介しています。

追記(2015/4/14)

HLS(HTTP Live Streaming)対応のサーバーを構築する手順を公開しました。
この方法では、PC・iOSAndroid(4.0以降)に対応可能です。
HTTP Live Streaming対応のライブ動画配信サーバーを構築する - idinorの日記

この手順によってできるようになることなど

OBS・FMLEなど日ごろ使い慣れたエンコーダーを使用して、ニコ生やCaveTubeなどのようにリアルタイムの動画配信が独自にできるようになります。
運営者は自分自身なので、基本的に何を放送しても運営による強制停止はありません。
理論上、サーバの回線使用率が100%に張り付くまで視聴者を増やせます。
ニコ生でよくある、サーバ側負荷による追い出し等は発生しません。

注意すべきこと

最大収容可能な視聴者数は、サーバが接続されている回線の上り帯域に完全依存します。自宅サーバはいくら好条件な回線でもISP等による上り帯域制限があるため、推奨しません。
何を配信しても強制停止はありませんが、配信するコンテンツには注意を払う必要があります。

手順

1. 前提

公式ドキュメントがソースからのビルドを前提としているため、その形で進めます。
ビルド後のバイナリを/usr/local/crtmpserverに配置(コピー)するものとします。
OSはCentOS 6(x86_64)を使用するものとします。
HTMLに埋め込むFlash動画プレイヤーは、flowplayerを使うものとします。

2. 必須パッケージのインストール

openssl-devel、gccgcc-c++、cmakeが必要です。
rootになるかsudoでインストールします。
インストール後は一般ユーザーに戻ってください。

su
yum install openssl-devel.x86_64 gcc.x86_64 gcc-c++.x86_64 cmake.x86_64
exit

または

sudo yum install openssl-devel.x86_64 gcc.x86_64 gcc-c++.x86_64 cmake.x86_64
3. SVNのチェックアウト

パスワード周りで何か聞かれるとは思いますが、yesで続行します。

svn co --username anonymous --password "" https://svn.rtmpd.com/crtmpserver/branches/1.0 crtmpserver
4. ビルド

自動的にcrtmpserverというディレクトリが作られ、その中に最新のソースツリーが入ります。
まずはcrtmpserver/builders/cmakeディレクトリへ移動します。

cd crtmpserver/builders/cmake

続いてcmakeディレクトリをクリーンアップし、cmakeを実行します。

sh cleanup.sh
cmake .

makeしてバイナリを作ります。

make
5. ファイルの配置

/usr/localディレクトリへ配置するため、念のためrootになります。
その後ファイルを移動し、パーミッションを変えておきます。

su

cd ../../../ && mv crtmpserver /usr/local/
chmod 755 -R /usr/local/crtmpserver

また後々必要になるであろうディレクトリ(ログ保管場所、サーバ側でストリーム録画時の保管場所)を作成します。

mkdir -p logs media
6. ネットワーク周りの設定

ポート1935を開放します。
iptablesを使用している場合は、下記のようなコマンドを入力します(server ipとなっている部分は、サーバのグローバルIPを入力します)。

iptables -A INPUT -p tcp -d <server ip> --dport 1935 -j ACCEPT
iptables -A INPUT -p udp -d <server ip> --dport 1935 -j ACCEPT
7. crtmpserverの設定

RTMPのサーバ機能(OBS, FMLEからのストリームを受け取って配信する機能)さえあればよいという場合は、下記の設定で問題ありません(実際これで動いています)。
設定ファイル名:/usr/local/crtmpserver/crtmpserver/settings.lua

configuration=
{
	daemon=true,
	pathSeparator="/",
	logAppenders=
	{
		--[[{
			name="console appender",
			type="coloredConsole",
			level=6
		},]]
		{
			name="file appender",
			type="file",
			level=6,
			fileName="/usr/local/crtmpserver/logs/crtmpserver",
			fileHistorySize=10,
			fileLength=1024*256,
			singleLine=true
		}
	},
	
	applications=
	{
		rootDirectory="applications",
		{
			name="flvplayback",
			description="test",
			protocol="dynamiclinklibrary",
			validateHandshake=true,
			mediaFolder="/usr/local/crtmpserver/media",
			aliases=
			{
				"live",
			},
			default=true,
			acceptors = 
			{
				{
					ip="(サーバのグローバルIPアドレス)",
					port=1935,
					protocol="inboundRtmp"
				},
			},
			authentication=
			{
				rtmp=
				{
					type="adobe",
					encoderAgents=
					{
						"FMLE/3.0 (compatible; FMSc/1.0)",
						"Wirecast/FM 1.0 (compatible; FMSc/1.0)",
						"My user agent",
					},
					usersFile="users.lua"
				},
			},
		},
		--#INSERTION_MARKER# DO NOT REMOVE THIS. USED BY appscaffold SCRIPT.
	}
}

このままだと認証することなく関係者以外でも配信できてしまうので、配信時(エンコーダーが接続するとき)のパスワードを設定します。
複数のユーザー名とパスワードの組を登録できます。
※この設定を行っても、配信されているストリームの再生は誰でも可能です。
設定ファイル名:/usr/local/crtmpserver/applications/flvplayback/users.lua

users=
{
    user1="password1",
    user2="password2"
}
8. crtmpserverの起動

rootで以下のコマンドを入力してcrtmpserverを起動します。

cd /usr/local/crtmpserver && ./crtmpserver/crtmpserver --deamon ./crtmpserver/settings.lua
9. 動画プレイヤーの配置

ここではflowplayer Flash版を使用します。下記リンクよりダウンロードしてください。
Pricing · Flowplayer
また、flowplayer RTMP pluginも必要です。下記リンク先で一番下までスクロールし、『flowplayer.rtmp-3.2.13.swf』か『flowplayer.rtmp-3.2.13.zip』をダウンロードしてください。
RTMP : Flowplayer
またもしよろしければ、拙作flowplayer設置用テンプレートをご利用ください。
XHTML+CSSの構成で、広告リンク設置スペースも確保してあります(コード中にコメントにて広告挿入箇所明記済み)。
playerpage.zip 直
ダウンロード後、flowplayerのパッケージを解凍し、webページ公開ディレクトリ(ここでは/home/www/liveとします)に配置します。
HTMLとCSSは下図の通りになるよう配置します。

また拙作flowplayer設置テンプレートを使用した場合、flowplayerは下図の通りになるよう配置します。

10. OBSの設定:配信時にサーバへ接続するときのユーザー名とパスワードの設定

日ごろ使っているのがOBSなので、その例を示します。
OBSを開き、『設定』メニューから『設定フォルダを開く』をクリックします。

設定フォルダが開いたら、『profiles』フォルダから対象となるプロファイル名のファイルを開きます。
プロファイル設定ファイルが開いたら、下方までスクロールし、『publish』セクションを探します。
見つけたら赤枠で囲まれた『Username』と『Password』パラメータを追加し、それぞれに先ほどusers.luaで設定したユーザー名とパスワードを書き加え、保存します。

11. OBSの設定:放送設定

crtmpserverの設定ファイルを、上記と同じにした場合は下図の設定でOKです。
設定内容等により先ほど配置したHTMLのコードを一部書き換える必要があるため、その点も明記しています。

配信

お好みの画質設定をしたあと、OBSの配信ボタンをクリックし、プレイヤーページで動画が正しく再生されることを確認してください。

スマートフォンタブレット端末での閲覧

現状Androidを採用した端末でのみ可能です。
ここでは、『Wondershare Player』を使った方法を紹介します。

1. Wondershare Playerのインストール

Playストアよりインストールします。

2. Wondershare Playerの設定

起動後、左上の三重線アイコン(図中赤丸内)をタップし、メニューを表示させます。

表示されたメニューから“Streaming”(赤枠内)をタップします。

画面中央下部の“Add streaming media”をタップします。

追加画面が表示されます。
“Stream Name”には、わかりやすい名前をつけることができます。
“Add Stream URL”には、『OBSの設定:放送設定』で設定したURL名とプレイキーを半角スラッシュで連結したものを入力します。
入力後、スクリーンキーボードの“Done”を押すと、リストに登録されます。

例
URLが“rtmp://test.net/live”で、プレイキーが“testuser”の場合は
rtmp://test.net/live/testuser
となります。

3. 閲覧(確認)方法

先ほどの手順を終えた段階で、リストに再生時の接続情報が保管されています。
OBSで配信を開始し、登録されたものをタップして再生ができることを確認してください。

設定は以上です

お疲れ様でした。快適な動画配信ライフを満喫してください。