複数のライブ配信動画をひとつのRaspberry Piで配信する

前の記事に添って、3個のRaspberry PiをIPカメラにしました。

日本橋ものづくりサミット2015の展示で使用する予定なのですが、 複数のRaspberry PiのIPアドレスを固定してしまうと開発がスムーズに行えないため、 動画配信用のHTMLを公開するためのRaspberry Piだけで良いようにします。

あらかじめ用意するRaspberry Pi

  • HTTPサーバー用(ホスト名 webcam-server)
  • カメラ用1(ホスト名 webcam1)
  • カメラ用2(ホスト名 webcam2)
  • カメラ用3(ホスト名 webcam3)

すべてのRaspberry Piは、ホスト名がRaspbianのデフォルトのRaspberryではなく、上述のホスト名に変更されているものとします。

カメラ用1〜3のRaspberry Piは「Raspberry Pi でライブ配信する - jakaladaのブログ」の記事に沿って、 MJPG-streamerによるライブ配信が行われている状態にセットアップされているものとします。

Avahiのインストール

Raspberry Piにavahi-daemonというパッケージをインストールすることで、Raspberry Pi同士がホスト名.localでアクセスできるようになります。

すべてのRaspberry Piにavahi-daemonパッケージをインストールします。

$ sudo apt-get install avahi-daemon

インストールした時点でavahi-daemonの動作は開始しているので、pingを投げるなどして、お互いにアクセスできる状態か確認します。

$ ping -c 3 webcam-server.local
$ ping -c 3 webcam1.local
$ ping -c 3 webcam2.local
$ ping -c 3 webcam3.local

Nginxのインストール・セットアップ

Nginxをほとんど理解できていないのですが、この記事ではWikipediaに記述されている以下の用途で使用します。

仮想的なサーバ統合: 複数のサーバがそれぞれ独自のサービスを提供している場合にリバースプロキシを導入して、利用者には1台のサーバとして見せることができる。

HTTPサーバー用のRaspberry Piにnginxパッケージをインストールします。

$ sudo apt-get install nginx

インストール後、/etc/nginx/sites-available//etc/nginx/sites-enabled/のファイルを確認します。

$ ls /etc/nginx/sites-available/
-rw-r--r-- 1 root root 2765  1月 10 19:00 default
$ ls /etc/nginx/sites-enabled/
lrwxrwxrwx 1 root root 40  1月 10 19:36 default -> /etc/nginx/sites-available/default

sites-enabledディレクトリのdefaultファイルは、sites-availableディレクトリのdefaultファイルへのシンボリックリンクです。

Nginxのサーバーの設定は、sites-availableディレクトリにテキストファイルとして保存し、sites-availableディレクトリにシンボリックリンクを作成することで有効化します。

以下の設定を/etc/nginx/sites-available/webcam-serverとして保存します。

server {
    root /var/www;
    index index.html index.html;

    server_name localhost;

    location / {
      try_files $uri $uri/ /index.html;
    }

    location /webcam1/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        proxy_pass http://webcam1.local:8080/;
    }

    location /webcam2/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        proxy_pass http://webcam2.local:8080/;
    }

    location /webcam3/ {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        proxy_pass http://webcam3.local:8080/;
    }
}

ディレクトリ/etc/nginx/sites-enabled/からdefaultを削除して、/etc/nginx/sites-available/webcam-serverへのシンボリックリンクを追加します。

$ sudo rm /etc/nginx/sites-enabled/default
$ sudo ln -s /etc/nginx/sites-available/webcam-server /etc/nginx/sites-enabled/webcam-server

上記の設定では/var/www/ディレクトリを静的なコンテンツの公開用に設定しているため、ディレクトリを作成し、HTMLファイルを配置します。

$ sudo mkdir /var/www
$ sudo chmod 755 /var/www

以下のHTMLファイルを/var/www/index.htmlとして保存します。

<!DOCTYPE html>
<html lang=ja>
  <head>
    <meta charset="UTF-8" />
    <title>Webcam Server</title>
  </head>
  <body>
    <div id="webcam1"><img src="/webcam1/?action=stream"></div>
    <div id="webcam2"><img src="/webcam2/?action=stream"></div>
    <div id="webcam3"><img src="/webcam3/?action=stream"></div>
  </body>
</html>

設定を反映させるために、Raspberry Piを再起動するか、Nginxを再起動します。

$ sudo /etc/init.d/nginx restart

動作確認

HTTPサーバー用のRaspberry PiのIPアドレスを確認し、http://IPアドレス/をブラウザで表示して、3個のRaspberry Piが配信している動画が確認できれば成功です。

自動起動設定 (2015/01/11 追記)

Nginxはデフォルトでは自動起動が有効になっていなかったため、 自動で起動して欲しい場合は以下のコマンドを実行して有効化します。

$ sudo insserv nginx