やりたいこと
以前、THETA Vを使って、4Kライブストリーミングができると書きましたが、
その核心をついてみたいと思います。
USBでPCと接続し、配信用ソフトOBSを用いて、外部のストリーミングサーバへ映像をRTMPプロトコルで転送することで、
Web/アプリを通じて、ユーザへライブ配信が可能なわけですね。
で、今回、自作サーバをストリーミングサーバ化して、配信してみたいと思います。
ストリーミングサーバを構築する際、調べたところ、
おなじみ、無償のWebサーバソフト「Nginx」で簡単に実現できてしまうということで、試しにやってみました。
ストリーミング形式について
- RTMPプロトコルで配信
→FlashやAdobe向けであり、近年だと対応端末などの間口が狭そう。
- HTTPプロトコルで簡単に配信
・HLS形式
→Apple社によるもの。そのため、Mac/iOSとの親和性が高い。(Androidでの再生も可能)
→ .m3u8というプレイリストと、.tsの細切れの動画ファイルで構成される。
・MPEG-DASH形式
→HLS形式の国際標準規格版のような位置づけでしょうか。
以下、詳細で読み込むとなかなか面白いですね。
qiita.com
今回、ゴールは、VRアプリとしてUnity側でライブ映像が再生できれば良し。
Unity側へGoogle VR SDKをインポートしてやることで、HLS形式もMPEG-DASH形式も両方とも再生できるらしいです。
Unityまわりはまた次回書きます。
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側で再生できるまでを追ってみたいと思います。
では、また!!
参考ページ