ブラック研究室へようこそ!

ブラック研究室。それは大学院生が放り込まれるかもしれない闇のアジト。在籍時代のエピソード・Web/アプリ開発の備忘録など。

【IT備忘録】NginxでHLS形式でライブストリーミング 〜THETA VでVRアプリ製作

やりたいこと

以前、THETA Vを使って、4Kライブストリーミングができると書きましたが、

その核心をついてみたいと思います。

f:id:blackLab:20180422233004p:plain

USBでPCと接続し、配信用ソフトOBSを用いて、外部のストリーミングサーバへ映像をRTMPプロトコルで転送することで、

Web/アプリを通じて、ユーザへライブ配信が可能なわけですね。

 

で、今回、自作サーバをストリーミングサーバ化して、配信してみたいと思います。

 

ストリーミングサーバを構築する際、調べたところ、

おなじみ、無償のWebサーバソフト「Nginx」で簡単に実現できてしまうということで、試しにやってみました。

ストリーミング形式について

  • RTMPプロトコルで配信

   →FlashやAdobe向けであり、近年だと対応端末などの間口が狭そう。

  • HTTPプロトコルで簡単に配信

   ・HLS形式

    →Apple社によるもの。そのため、Mac/iOSとの親和性が高い。(Androidでの再生も可能)

    → .m3u8というプレイリストと、.tsの細切れの動画ファイルで構成される。

did2memo.net

   

   ・MPEG-DASH形式

    →HLS形式の国際標準規格版のような位置づけでしょうか。

     以下、詳細で読み込むとなかなか面白いですね。
qiita.com

   

今回、ゴールは、VRアプリとしてUnity側でライブ映像が再生できれば良し。

Unity側へGoogle VR SDKをインポートしてやることで、HLS形式もMPEG-DASH形式も両方とも再生できるらしいです。

Unityまわりはまた次回書きます。

developers.blog.eq-inc.jp

 

HLS形式の方が、構築のハードルは低いようなので、

今回は、HLS形式でのライブ配信を目指します。

 

環境/前提条件

  • スタート時のサーバ環境

   ・さくらVPSサーバ(OS:Cent OS 6.9)

   ・既に別用途で、Nginxを導入済み

  • 前提条件 

    ・NginxでHLS形式のライブ配信を実現する。

 

①Nginxを入れ直す

既にNginxをWebサーバ用に導入していたのですが、

今回実現するためには、「nginx-rtmp-module」のモジュールが必要になってきます。

しかし、このモジュールを入れるには、最初からNginxをビルド(導入)しなければならないとのこと。実に不便…。

 

ということで、旧Nginxと、新Nginx(今回)で両方ありつつも、新Nginxのみを動かす形で、仕方なく進めます。

 

あらかじめ必要なライブラリを導入。

sudo yum install pcre-devel openssl openssl-devel

 Nginx-1.8.0をダウンロードし、展開。

cd /var/tmp/
sudo wget http://nginx.org/download/nginx-1.8.0.tar.gz
sudo tar -zxvf nginx-1.8.0.tar.gz

 nginx-rtmp-moduleをダウンロードし、展開。

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

 Nginxをビルドします。念のため、ssl_moduleも追加。

そして、--with-ipv6を指定しないと、起動できないらしいので追記。

cd nginx-1.8.0
sudo ./configure --with-http_ssl_module --with-ipv6  --add-module=../nginx-rtmp-module-master
sudo make
sudo make install

新Neginxは、/usr/local/nginx/配下にインストールされています。
nginx.confを編集しましょう。

sudo vim /usr/local/nginx/conf/nginx.conf

 以下、追記します。

OBSからRTMPプロトコル(1935番ポート)(http://IPアドレス/live)で映像を受け付けたら、HLS形式で配信する形となります。

rtmp {
    server {
        listen 1935;
        access_log /var/log/nginx/rtmp_access.log;
         application live {
            live on;
            record off;
            wait_video on;

            hls on;
            hls_path /var/www/html/hls;
            hls_fragment 1s;
            hls_type live;
        }
    }
} 

最後に、旧Nginxから新Nginxへ切り替えします。

#旧Nginxを停止
sudo nginx -s stop

#/usr/sbin/nginxが旧Nginxの実行ファイルなので、名前変更
cd /usr/sbin/
sudo mv nginx _nginx
#/usr/sbin/へ新Nginxの実行ファイルのシンボリックリンクを追加
sudo ln -s /usr/local/nginx/sbin/nginx ./nginx

#新Nginxを起動
sudo nginx -s start

これでNginxの導入が完了しましたよ!

 

②iptablesで1935番を開放

iptablesの定義を確認。--line-numbersを付けて、行番号を出るようにする。

sudo iptables -L --line-numbers

こんな感じで表示される。ACCEPTの中のどっかで良いので、適当に8行目に追加しちゃいますか。

Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
2    DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE 
3    DROP       tcp  --  anywhere             anywhere            tcp flags:!FIN,SYN,RST,ACK/SYN state NEW 
4    DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG 
5    ACCEPT     all  --  anywhere             anywhere            
6    ACCEPT     icmp --  anywhere             anywhere            
7    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
8    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 
9   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https 
10   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp 
11   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp-data 
12   ACCEPT     tcp  --  anywhere             anywhere            tcp dpts:50021:50040 
13   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftps 
14   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:hbci 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination 

1935番ポートを開放します。(8行目に追加)

sudo iptables -I INPUT 8 -p tcp -m tcp --dport 1935 -j ACCEPT

すると、「macromedia-fcs」という名前で開放されます。これでいいらしい。

Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 
2    DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE 
3    DROP       tcp  --  anywhere             anywhere            tcp flags:!FIN,SYN,RST,ACK/SYN state NEW 
4    DROP       tcp  --  anywhere             anywhere            tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,PSH,ACK,URG 
5    ACCEPT     all  --  anywhere             anywhere            
6    ACCEPT     icmp --  anywhere             anywhere            
7    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
8    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:macromedia-fcs 
9    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 
10   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https 
11   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp 
12   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftp-data 
13   ACCEPT     tcp  --  anywhere             anywhere            tcp dpts:50021:50040 
14   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ftps 
15   ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:hbci 

 そして、セーブ&リロードで完了!

sudo service iptables save
sudo service iptables restart 

 

 構築完了!

Nginxでライブ配信用サーバを構築できました。

次回、実際にOBSでTHETAの映像を転送し、Unity側で再生できるまでを追ってみたいと思います。

 

では、また!!

 

参考ページ

qiita.com

idinor.hatenablog.com