Nginx で RTMP サーバーを建てて iPad をサブディスプレイにする

7 min読了の目安(約4300字TECH技術記事

はじめに

Zennリリースおめでとうございます。ということで初記事です。

今回はみなさんのお部屋に一台は転がっているであろう某 Apple 社の iPad を擬似的なサブディスプレイにしてみます。

環境

  • Ubuntu Server 20.04 on Hyper-V (IPアドレス 10.0.0.237)
  • Nginx v.1.19.2
  • iPad Air 2

記事中の各リンクについては執筆日(2020/9/27)時点での最新となります。

概要

  1. OBS で映したい画面を作成
  2. Ubuntu Server で動く Nginx に送信
  3. iPad で VLC Media Player を使って表示

作業開始

RTMP サーバーを建てる

今回は Hyper-V を使用しますが、仮想マシンの建て方については割愛します。
OS をインストール済みの仮想マシン(物理マシンでも可)が用意できているものとして進めます。

とりあえず諸々を更新

$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt auto-remove -y

ライブラリをインストール

build-essential libpcre3 libpcre3-dev libssl-dev unzip をインストールします。

$ sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev unzip

Nginx-RTMP-Module を Clone

Nginx-RTMP-Module を Clone します。

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

このままだと Nginx のコンパイル中に Switch 文でエラーが発生するのでコードを編集します。

$ cd nginx-rtmp-module
$ vi ngx_rtmp_eval.c

169行目に追記に break; を追記します。
以下はわかりやすいように行番号を追加しています。

/* 159 */  case NORMAL:
/* 160 */      switch (c) {
/* 161 */          case '$':
/* 162 */              name.data = p + 1;
/* 163 */              state = NAME;
/* 164 */              continue;
/* 165 */          case '\\':
/* 166 */              state = ESCAPE;
/* 167 */              continue;
/* 168 */      }
/* 169 */      break; // <-- これを追記
/* 170 */  case ESCAPE:
/* 171 */      ngx_rtmp_eval_append(&b, &c, 1, log);
/* 172 */      state = NORMAL;
/* 173 */      break;

Nginx のソースコードをダウンロードしインストール

Nginx 公式ページ からソースコードをダウンロードします。

$ wget http://nginx.org/download/nginx-1.19.2.tar.gz
$ tar -zxvf nginx-1.19.2.tar.gz
$ cd nginx-1.19.2

NginxNginx-RTMP-Module を追加してインストールします。

$ ./configure --add-module=../nginx-rtmp-module --without-http_gzip_module
$ make
$ sudo make install

Nginx のスタートアップスクリプトをダウンロードし配置します。

$ sudo wget -O /etc/init.d/nginx https://gist.github.com/tomazzlender/1885291/raw/556967339a5bd05b47e962f721b976d4c953f619/nginx
$ sudo chmod +x /etc/init.d/nginx
$ sudo update-rc.d nginx defaults

試しに Nginx を再起動してみましょう。

$ sudo systemctl restart nginx

エラーが出なければインストール完了です。

Nginx を設定

Nginx の設定ファイルは /usr/local/nginx/conf/nginx.conf です。

$ sudo vi /usr/local/nginx/conf/nginx.conf

今回は映像のリレーが目的なので下記に書き換えます。

worker_processes 2;
events { worker_connections 1024; }
rtmp_auto_push off;

rtmp {
    server {
        listen [::]:1935 ipv6only=off;
        chunk_size 4096;

        application live {
            meta on;
            wait_video on;
            live on;
            record off;
        }
    }
}

書き換えたら Nginx を再起動してみましょう。

$ sudo systemctl restart nginx

正常に再起動ができたら OK です。

OBS で配信

OBS のインストールは済んでいるものとして進めます。
未インストールの方はこちらからインストールしてください。

image.png

シーンを一つ作成して適当なソースを配置してください。

続いて OBS の 設定 を開き、 配信 を開きます。

image.png

初期値は Twitch になっていますが、プルダウンメニューから カスタム を選択します。

image.png

サーバーrtmp://[サーバーのIPアドレス]/live を入力、 ストリームキー は空欄で OK をクリックします。

設定が完了したら 配信開始 をクリックします。

image.png

右の四角が緑になり、 LIVE のタイマーが動き出したら OK です。

iPad で表示

image.png

App StoreVLC Media Player をダウンロードします。

image.png

VLC Media Player を起動して ネットワーク タブをタップします。

image.png

ネットワークストリームを開く をタップします。

rtmp://[サーバーのIPアドレス]/live を入力し、 ネットワークストリームを開く をタップします。

image.png

OBS と同じ映像が表示されたら成功です。

OBS 上で表示したいものを並べると擬似的にサブディスプレイとして使用できます。
また、 PC 上の音声も取り込んで配信できるので、 iPad のイヤホンジャックや Bluetooth で聴くことができます。

おわり

おつかれさまでした。

※このやり方では HDCP プロテクトを解除できないので DVD / Blu-ray コンテンツ等、映せないものがあります。