Raspberry Pi ✕ Nginxで RTMP & HLS ストリーミングサーバ
現在、このブログを運用している、Raspberry Pi 2 ✕ Nginx サーバ に、RTMPサーバを構築しました。
目次
Nginx に RTMP モジュール を追加
Nginx にモジュールを追加するにはコンパイルをし直さなければならないので、apt-get install していた Nginx 1.6.2 から現時点で最新の Nginx 1.11.13 をインストールし直し、環境を移行しました。
※ メモ
バージョン 1.9.11 以降、動的モジュールがサポートされ始めているようです。
nginx-1.9.11で動的モジュールをサポート – インフラエンジニアway – Powered by HEARTBEATS
RTMPサーバの設定
nginx.conf
http {} の外に rtmp{} の設定を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sudo vi /usr/local/nginx/conf/nginx.conf user www-data; worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 1024; } http { (設定〜略) include /usr/local/nginx/conf.d/*.conf; } # RTMP include /usr/local/nginx/conf.d/rtmp-conf; |
nginx.conf は短くしておきたいので、設定は外部ファイルにしました。
rtmp-conf
conf.d に RTMPの設定ファイル rtmp-conf を作成しました。
Android でも見れるようにHLSの設定もしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ sudo vi /usr/local/nginx/conf.d/rtmp-conf rtmp { server { listen 1935; chunk_size 4096; access_log /var/log/nginx/rtmp_access.log; application live { live on; hls on; record off; hls_path /サーバの公開ディレクトリ/live/hls; hls_fragment 1s; hls_type live; } } } |
設定項目に関してはこちらのブログ記事を参考にさせて頂きました。
nginxでrtmp配信サーバを構築する【完全版】 | VariedTasteFinder
(個人的メモ)
※ 最初 「rtmp.conf」という名前で ファイルを作成したのですが、http{} の中で conf.d ディレクトリ配下の 拡張子 .conf ファイルを include するようにしてあるため、http{} の中で rtmp{} が読み込まれる形になってしまい失敗しました(;´∀`)
ディレクトリ構成とかはもっと考えて行った方が良いのかもしれない(´・ω・`)
1 2 |
$ ls /usr/local/nginx/conf.d/ 80.conf 8080.conf rtmp-conf |
hls_path のディレクトリ作成
hls_path で設定したディレクトリを作成します。
1 2 |
$ sudo mkdir /サーバの公開パス/live $ sudo mkdir /サーバの公開パス/live/hls |
構文チェック
1 2 3 |
$ sudo nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful |
※ hls_path のディレクトリが存在しない時下記のような、mkdir を促すエラーになります。
1 2 3 4 |
$ sudo nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: [emerg] mkdir() "/var/www/vhosts/default/live/hls" failed (2: No such file or directory) nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed |
↑コピペしたままでディレクトリが間違っていました
nginx を再起動
1 |
$ sudo service nginx restart |
配信ページの設定
2017.11.12 加筆
最初 video.js を使用していたのですが、久々に試してみたらブラウザでエラーが出て再生出来なくなっていました。
chrome でこんな感じのエラーが出ていました。
1 |
VIDEOJS: ERROR: (CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) No compatible source was found for this media. d {code: 4, message: "No compatible source was found for this media."} |
色々やってみましたが解消出来なかったので video.js を辞めて hls.js に変更しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<!DOCTYPE html> <html lang="en" class=""> <head> </head> <body> <script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script> <video id="video"></video> <script> if(Hls.isSupported()) { var video = document.getElementById('video'); var hls = new Hls(); hls.loadSource('/live/hls/stream.m3u8'); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED,function() { video.play(); }); } </script> </body> </html> |
こちらの記事を参考にさせて頂きました。
.hlsをブラウザ関係なく一発再生する “hls.js” – バッカムブログ
※ loadSource の所は IPアドレスを指定してドメインからアクセスすると
1 |
No 'Access-Control-Allow-Origin' header is present on the requested resource. |
といったエラーになります。
以下は、加筆前の video.js の記事です
配信ページの置場はどこでも大丈夫です。
今回は 先程作成した live ディレクトリの下に置いてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ sudo vi /公開ディレクトリ/live/index.html <!DOCTYPE html> <html lang="en" class=""> <head> <link href="http://vjs.zencdn.net/4.6/video-js.css" rel="stylesheet"> <script src="http://vjs.zencdn.net/4.6/video.js"></script> </head> <body> <video id="rtmp live stream" class="video-js vjs-default-skin" controls preload="auto" width="640" height="480" data-setup='{}'> <!-- 配信先のもろもろのURL --> <source src="http://192.168.0.XX/live/hls/stream.m3u8" type='application/x-mpegURL'> <source src="rtmp://192.168.0.XX/live/stream" type='rtmp/mp4' /> <source src="rtsp://192.168.0.XX/live/stream" type='rtsp/mp4' /> </video> </body> </html> |
URLについて
- 192.168.0.XX のところは、サーバのIPアドレス
- /live/ は、rtmp {} の設定で application live {} で設定してある文字列
- /stream は配信時に設定する任意のストリームキー
ソースコードはこちらの記事でご紹介下さっているものを使用させて頂きました。
Live Streaming on Web 概観 – Qiita
配信ページのディレクトリにBASIC認証追加
1 2 3 4 5 6 7 8 9 10 11 |
sudo vi /usr/local/nginx/conf.d/80.conf server { listen 80; (略) location /live/ { auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://backend; } (略) } |
クライアント
ffmpeg でやるのが簡単かと思いましたが、いつの間にか Mac で ffmpeg 使えなくなってる orz
そのうち対応するとして今回は OBS というソフト を使いました。
配信設定など、こちらの記事を参考にさせて頂きました。
nginx-rtmp-moduleでお試しLive配信環境を作る – Qiita
iMac で何故かカメラが認識されず、とりあえず画面共有でストリーミングテストを行いました。
配信確認
PCからもAndroid からもバッチリ!声も聴こえる!????
参考にさせて頂きました
- Raspberry Pi + nginx で低負荷RTMPサーバを構築する | VariedTasteFinder
- nginxでrtmp配信サーバを構築する【完全版】 | VariedTasteFinder
- nginx-rtmp-moduleでお試しLive配信環境を作る – Qiita
- Live Streaming on Web 概観 – Qiita