アールテクニカ地下ガレージ

アールテクニカ株式会社の製品開発・研究開発・日々の活動です

Raspberry Pi 2 + HDMI入力 でフルHD をUstreamに配信してみる (2)

Author

koss (社長)

前回までのあらすじ

Raspberry Pi 2にHDMI入力ボードを取り付け、GStreamerを使ってUstreamにフルHDで配信することに成功した。…のだが、2日半連続稼働させるとGStreamerが異常終了してしまう。定点観測用として、数カ月の連続稼働を目標としているので、改善の必要があるのだった。

artteknika.hatenablog.com

 

なにが悪いのか

原因は分かっていない - 原理試作なので深く調査もしていない - が、同じくラズパイ + GStreamer + rtmpsink の構成で「しばらくすると落ちる」と言う報告はネットでいくつか探すことが出来た。下記記事によると「Ustreamに送出する部分としてnginxを使う」手法があるらしい。

RaspberryPiで高画質ライブ配信 - ディーズガレージ wiki

 

nginx とrtmp-moduleのインストール

nginx (エンジンエックスと読む!)は軽量のhttpサーバで、拡張モジュールによってrtmpやHLSに対応するらしい。

この辺りを参考に、インストールする。

How to set up your own private RTMP server using nginx | Open Broadcaster Software

素のnginxはapt-get一発で取って来られるのだが、rtmp-moduleを抱かせてあげないといけないので、ソースからコンパイルする必要がある。

#ビルドに必要なライブラリをインストール

$ sudo apt-get install build-essential libssl-dev

#nginx インストール作業用のディレクトリ

$ mkdir nginx-rtmp
$ cd nginx-rtmp

#本体のソースを落としてくる (このときの最新版)
$ wget http://nginx.org/download/nginx-1.9.5.tar.gz

#rtmp-modileを落としてくる

$ wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

#解凍

$ tar -zxvf nginx-1.9.5.tar.gz
$ unzip master.zip

#ビルド開始
$ cd nginx-1.9.5

$ ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
$ make
$ sudo make install

rtmp-moduleと一緒にインストール完了。

$ sudo /usr/local/nginx/sbin/nginx

nginxを起動して、Webブラウザでラズパイにアクセスするとこんな画面になる。

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

当たり前ですね。ひとまずnginxが正しくインストールできたことを確認。

rtmpサーバの設定

nginxをrtmpサーバとして使うための設定も必要だ。

設定ファイルは、おそらく

/usr/local/nginx/conf/nginx.conf

にあるだろう。nginxのいくつかのパラメータの設定に続いて、

http {

...

}

と書かれたセクションがある。お察しのように、httpサーバとしてのnginxの各種設定項目はここに書くのだが、今回はここは無視する。このあとに、rtmpサーバの設定セクションを追記する。

rtmp {
    server {
        listen 1935;
        publish_time_fix off;
        chunk_size 4096;

        application live {
            live on;
            record off;

#Ustream

            push rtmp://x.xxxxxxx.fme.ustream.tv app=ustreamVideo/yyyyyyyy playpath=zzzzzzzzzzzzzzzz;

        }

    }
}

"application" セクションで、"live"と言う名前のrtmp配信サイトを運用する、と言う設定だ。さらに、push ディレクティブで「受けた映像ストリームをUstreamの特定の番組に配信する」設定をしている。「xxxx」「yyyy」「zzzzz」部分は、自分の番組のRTMP URLとストリームキーから読み換えて埋めてほしい。pushディレクティブを並列して書けば、Youtube Liveなどの他のrtmpサービスに同時に配信できるらしいが未確認。

さて、設定を変えたので、nginxを再起動する。

$ sudo /usr/local/nginx/sbin/nginx -s stop
$ sudo /usr/local/nginx/sbin/nginx

GStreamerからの送出

rtmpサーバとして歩みはじめた(はずの)nginxに、HDMIからの映像ストリームを喰わせてやらないといけないのでGStreamの出番となる。前回のパイプラインに少し手を加えてこのようにする。

#!/bin/sh

LOCATION="rtmp://localhost/live/stream"

BITRATE=10000000
FRAMERATE='30/1'

CMD="gst-launch-1.0 rpicamsrc preview=0 bitrate=$BITRATE ! video/x-h264, width=1920, height=1080, framerate=$FRAMERATE ! h264parse ! flvmux ! rtmpsink location='$LOCATION'"


$CMD

実行すると、ほどなくしてUstでの配信が始まった。

本質的には、rtmpsink の配信先をラズパイ内のnginxにしただけである。それを受け取ったnginxがUstreamに中継してくれる、とイメージすると良いだろう。

現在、3日を超えての継続配信中。長期安定化策としては、ひとまずの成功だが、さらに長期のテストが必要だ。

ラズパイ内へ配信とは言え、相変わらずGStreamerでrtmpsinkを使っているし、別のプロセスを経由すると言う面倒なことをしている方が安定するのは気持ち悪い気がしなくもないが、原理試作であるからにしてこれで良いのだ。

次のステップ...

「配信しながらのローカルでの録画」に着手したい。GStreamerからfilesinkするか、nginxのrtmp-moduleのrecord機能を使っても良いだろう。パフォーマンスの問題や、同時に2系統(配信ストリームが1つと、もう1つはタイムラプスとか)録画できるか、とか調べてみたい。

…と思っていたが、こんなものが発表された。

static-shell.cerevo.com

僕は定点観察のために、LiveShell Proを使っており、これはとてもすばらしいプロダクトで、とても重宝しているのだが、細かいところで自分の用途に足りない部分もある。「ローカル録画」機能はその1つだった。「かゆい所にも手が届くLiveShell」を目指して、このラズパイ試作を始めたのだが、LiveShell XでだいたいOKな匂いがしてきた。きっとずっとロバストで、値段も現実的だ。LiveShell Xが発表されてテンションは上がる一方、試作のモチベーションは下がり気味。

とは言え、自分の用途に完全にマッチはしないだろう。その辺の、さらに細かいところを突いていくか…。

選択せねばなるまい。

 

 

 

 

Author

koss (社長)

アールテクニカ株式会社 代表取締役。株式会社エイガアルライツ取締役として漫画『コブラ』などの寺沢武一作品を世に送り出すプロデューサーでもある。 「映画 / 音楽 / 生き物 / 宇宙 x IT」を人生のテーマとする。 昆虫の変態専門チャンネル「コーカサスTV」をUstreamにて配信中。みんな見てくれよな!

スポンサーリンク