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回は僕のところが主催みたいなので頑張ります。

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

インターンシップ5日目(最終日)

 インターンシップ最終日の報告がまだでしたね!!!

投稿が遅れた(忘れた)には深いわけがあるのですが、それはさておき...。

 

前回の記事にもあった通り、最終日は本社のほうで成果発表会を行いました。

僕の発表はまあまあって感じでしたが締めで噛んでしまったので結構恥ずかしかったです。

報告会の後に社員と懇談会みたいなのがありました。就職についてたくさん聞くことができたのでよかったなと。

 

で、懇談会が終わってっみんなで写真撮って、すぐ社宅に帰りました。

次の日の朝の便で帰ってきました。

本当にインターンシップだけに東京に来たって感じで、特にどこにも行かなかったので少し残念でしたね。

 

あ...昼食は社食でいただきました。不味いって聞いていましたが、寮食食べてるせいなのか、そこまで不味いとは思いませんでしたね。普通。

インターンシップ4日目

おはようございます、いい朝ですね!!

昨日は早めに寝たので寝起きがすこぶるいいのです。(投稿が遅れた理由)

 

さっそく4日目にしたことを...

  認証局の運営について軽くお勉強。

  サービスへのアクセス数状況の確認。

  成果発表会に向けた資料作成。

 

そう最終日にはなんと本社のお偉方も何人か呼んで成果発表会を行うのです...

企業のお偉方相手に発表なんてしたことないので、もう怖くて怖くて...。

 

で、お昼ごはんはとんかつ屋さんで三元豚を食べました。

 

インターンシップ3日目

インターンシップ3日目!!!!!!!!!!!!!

たのしぃぃぃぃぃ!!!!!!!

 

今回も書くことはあんまりなさそうなのでとりあえずテンション高めで始めてみました。まあテンション高めたところでなんですが。

 

3日目にしたことは、

CAの構築、証明書の発行。

web系の脆弱性を検査。

の2つ。

 

前回の記事にも書いた通り、今回のインターンで学んだことはいずれ落ち着いたら記事にしたいと思ってます。

 

で、お昼はピザを食べました。