RTMPを使って校内のデジタルサイネージを管理した話

校内のデジタルサイネージ(授業変更とかを掲示している)を管理したいって案件を後輩が請け負ったけどいつの間にか手伝っていた話。

途中から参加したせいで、今までがどんなシステム使っててどんなシステムが欲しいのか全然知らない。とりあえずRTMPで配信してブラウザで再生したいって話だからそこだけ実装したのでとりあえずまとめておこう。

 

Environment (2018/02/26)

OS: CentOS7
Nginx 1.13.9
Nginx-rtmp-module
OBS-studio

1. Nginx Installation procedure

インストール時に必要なパッケージの調達.

$ sudo yum install wget gcc pcre-devel openssl openssl-devel

rtmp-moduleのダウンロード.

$ git clone https://github.com/arut/nginx-rtmp-module.git

Nginxのダウンロード.

$ wget http://nginx.org/download/nginx-1.13.9.tar.gz
$ tar zxf nginx-1.13.9.tar.gz
$ cd nginx-1.13.9

makefileの作成.

$ ./configure --sbin-path=/usr/sbin/nginx \
 --conf-path=/etc/nginx/nginx.conf \
 --error-log-path=/var/log/nginx/error.log \
 --http-log-path=/var/log/nginx/access.log \
 --pid-path=/var/run/nginx.pid \
 --lock-path=/var/run/nginx.lock \
 --prefix=/usr/local/nginx \
 --user=nginx \
 --group=nginx \
 --with-http_ssl_module \
 --with-http_realip_module \
 --with-http_addition_module \
 --with-http_sub_module \
 --with-http_dav_module \
 --with-http_flv_module \
 --with-http_mp4_module \
 --with-http_gzip_static_module \
 --with-http_random_index_module \
 --with-http_secure_link_module \
 --with-http_stub_status_module \
 --add-module=[ gitでダウンロードしたRTMPモジュールのパス ]

インストール.
ユーザーnginxの主所属グループを[nginx]として登録.
ユーザーnginxのログインシェルを不可に設定.

$ make
$ sudo make install
$ sudo groupadd nginx
$ sudo useradd -g nginx nginx
$ usermod -s /bin/false nginx

/etc/nginx/nginx.conf の末尾に追記

rtmp {
    server {
        listen 1935;
        access_log /var/log/nginx/rtmp_access.log;
        application live(アプリケーション名) {
            live on;
            record off;
        }
    }
}

Nginxの起動

$ sudo /usr/sbin/nginx

Nginxの停止

$ sudo /usr/sbin/nginx -s stop

firewalldのポートを開ける.
リロード後、追加されたポート番号の確認.

$ firewall-cmd --add-port=1935/tcp --zone=public --permanent
$ firewall-cmd –reload
$ firewall-cmd --list-ports --zone=public

 2. OBS Installation procedure

OBS(Open Broadcast Software)とは, リアルタイムで録画・エンコーディング・ブロードキャスティングが行えるオープンソースソフトウェア(wiki参照).
わざわざサーバー側に導入する必要はない.
CentOS7への導入は少し面倒.
公式によるとNux Desktopを使えばいいとのことなのでレポジトリを追加.

$ sudo yum -y install epel-release
& sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

あとは公式のドキュメント通りやっていく
ビルドに必要な環境をそろえる

$ sudo dnf install gcc gcc-c++ gcc-objc cmake git

パッケージをいろいろ落としてくる.

$ sudo yum install libX11-devel mesa-libGL-devel libv4l-devel \
 pulseaudio-libs-devel x264-devel freetype-devel \
 fontconfig-devel libXcomposite-devel libXinerama-devel \
 qt5-qtbase-devel qt5-qtx11extras-devel libcurl-devel \
 systemd-devel ffmpeg ffmpeg-devel

OBSのビルドとインストール

$ git clone --recursive https://github.com/jp9000/obs-studio.git
$ cd obs-studio
$ mkdir build && cd build
$ cmake -DUNIX_STRUCTURE=1 ..
$ make -j4
& sudo make install

OBSの起動(たぶん)

$ obs

設定から配信先とストリームキーを指定する.
配信先例: rtmp://192.168.11.14/live
つまり rtmp://ホスト名/アプリケーション名
ストリームキーは受け取り側と合わせる必要がある.

 3. Player on Web Browser

プレイヤーを用意する.
今回使用する方法ではAdobe Flash Playerを使用するので注意.
ここflowplayer-3.27.swfから以下の4つをダウンロード(wgetとか)する.

- flowplayer-3.2.6.min.js
- flowplayer-3.2.7.swf
- flowplayer.rtmp-3.2.3.swf
- flowplayer.controls-3.2.5.swf

head に以下を追加.

<script type="text/javascript" src="flowplayer-3.2.6.min.js"></script>

body に以下を追加

<a id="player" style="display:block;width:1280px;height:720px"></a>
<script>
  flowplayer("player","flowplayer-3.2.7.swf",{
    clip:{
      live: 'true',
      url: 'rtmp://OOOOOOO/live/ストリームキー',
      provider: 'rtmp'
    },
    plugins: {
      rtmp: {
        url: 'flowplayer.rtmp-3.2.3.swf',
        durationFunc: 'getStreamLength',
        netConnectionUrl: 'rtmp://OOOOOOO/live/ストリームキー'
      }
    }
  });
</script>

 

完成 !!!

 

※ドキュメント作成後の確認は行っておりませんのでうまく動作しない可能性があります.

その際は連絡を頂けると幸いです.

 

SECCON 2017 Online CTFに参加した

タイトル通りSECCON 2017 Online CTFに参加しました。

前回はペンギンさんとゆかいな仲間がいたのですが、ペンギンさんは他の群れと参加するみたいで、他のメンバーも高専総合文化祭とやらで、僕一人で参加しました。

寂しすぎて死にそうでした。

全然解けませんでしたね、たった3問でした。

write-upは書く気が起きなかったのでアーカイブだけして終えました。

 

もうキレたふざけんなよ来年もっと強くなって帰ってきてやるからな!!

泣いても許さねぇからな!!

KOSENセキュリティコンテスト2017に参加した(いまさらn回目)

KOSENセキュリティコンテストに参加しました。

先輩のペンギン(現在ドイツ生息)に誘われての初CTFでした。

 

 初めてだったので全然解けなくて数問しか解いた覚えがない(すぐ記事書かないから)

もっと勉強せんとあかんですよ

 

第28回プロコンに参加してきた(今さら何)

第28回プログラミングコンテストに参加しました。

僕は課題2番 のカーリング疑似体験システムの開発に参加しました。

開発が全然うまくいかなくて、もう精神ボロボロでしたがな

当日はこんな感じ... 最終日、疲れてあはぁぁって顔してたら

前の方に呼ばれて行ったら相互評価(?)で1位もらったみたいで困惑

f:id:silvestris017:20171219011423j:plain

f:id:silvestris017:20171219011401j:plain

 

次の第29回は僕のところが主催みたいなので頑張ります。

自動パスタ茹で機(現在開発中)を会場に置きたい。