GStreamer で NDI を使用する

NDI を使用することで同じネットワーク内での映像のやり取りが非常に簡単に行えるようになります。
ここでは、GStreamer で NDI を使用するまでの手順を簡単に説明します。

GStreamer で NDI を使用するためのプラグインが下記の github に公開されています。
https://github.com/teltek/gst-plugin-ndi

cargo のインストール

gst-plugin-ndi は、Rust で作成されているためビルドには、cargo が必要になります。

$ wget https://static.rust-lang.org/rustup/archive/1.24.3/x86_64-unknown-linux-gnu/rustup-init
$ chmod +x rustup-init
$ ./rustup-init -y --no-modify-path --profile minimal --default-toolchain 1.53.0 --default-host x86_64-unknown-linux-gnu

cargoにパスを通します。

$ source $HOME/.cargo/env

インストールができているか以下のコマンドで確認をします。

$ rustup --version
$ cargo --version
$ rustc --version

avahi-daemon のインストール

Ubuntu で NDI を使用する場合には avahi-daemon をインストールしてサービスを起動しておく必要があります。

$ sudo apt-get install -y avahi-daemon

avahi-daemon の起動

avahi-daemon は dbus サービスを必要とするため、dbus サービスも起動します。

$ service dbus start
$ service avahi-daemon start

NDI SDK のインストール

下記のサイトから NDI SDK をダウンロードできます。
https://ndi.tv/sdk/

NDI SDK がダウンロードできましたら、以下の手順でインストールを行います。

$  tar xvzf Install_NDI_SDK_v5_Linux.tar.gz
$ ./Install_NDI_SDK_v5_Linux.sh
sudo mkdir -p /usr/include/ndi
sudo cp NDI\ SDK\ for\ Linux/include/* /usr/include/ndi/
sudo cp NDI\ SDK\ for\ Linux/lib/x86_64-linux-gnu/* /usr/lib/

gst-plugin-ndi のビルド

$ git clone https://github.com/teltek/gst-plugin-ndi
$ cd gst-plugin-ndi 
$ cargo build --release
$ sudo install -o root -g root -m 644 target/release/libgstndi.so /usr/lib/$(gcc -dumpmachine)/gstreamer-1.0/
$ sudo ldconfig
gst-plugin-ndi のバージョンによっては、以下のようなエラーが発生します。
Caused by:
  feature `edition2021` is required

  this Cargo does not support nightly features, but if you
  switch to nightly channel you can add
  `cargo-features = ["edition2021"]` to enable this feature
上記のエラーが発生した場合には、下記のコマンドを実行してから、再度ビルドを行なってください。
rustup default nightly && rustup update

テスト映像を NDI で配信

以下のパイプラインで、テスト映像が配信されます。

$ gst-launch-1.0 videotestsrc is-live=true \
     ! video/x-raw,format=UYVY \
     ! ndisinkcombiner name=combiner \
     ! ndisink ndi-name="MyNDI" \
   audiotestsrc is-live=true \
     ! combiner.audio"

同じネットワーク内にある端末から NewTek NDI Video Monitor というツールを使用して、ndisink で配信している映像を確認することができます。
このツールも NDI SDK と同じサイトからダウンロードすることができます。Windows 版と Mac 版が提供されていますが、今回は Mac 版で確認を行いました。

映像が配信されている場合には、File > GSTREAMER > MyNDI が表示されます。

配信されている映像のメニューを選択することで、映像が表示されます。また、「ピー」というテスト音声が再生されます。

NDI の入力を受信

上記で説明した gstreamer で配信する以外にも OSB を使用したり、NewTek NDI Scan Converter を使用することで NDI で配信することができます。他にも配信用のツールがありますので、それらから配信を行います。

$ gst-launch-1.0 ndisrc ndi-name="GSTREAMER (MyNDI) " \
     ! ndisrcdemux name=demux  \
   demux.video \
     ! queue \
     ! videoconvert \
     ! autovideosink  \
   demux.audio \
     ! queue \
     ! audioconvert \
     ! autoaudiosink

ndi-name に 配信している NDI の名前を入力します。

ndi-name の調べ方としては、avahi-browse を使用する方法があります。 下記のようにコマンド打ち込むと、公開されている mDNS/DNS-SD の一覧が表示されます。 ネットワークタイプが _ndi._tcp になっているサービスの名前を ndi-name に指定します。

$ avahi-browse -a
+ br-6a8021a36df2 IPv4 GSTREAMER (MyNDI)                             _ndi._tcp            local
+ docker0 IPv4 GSTREAMER (MyNDI)                             _ndi._tcp            local
+   eth1 IPv4 GSTREAMER (MyNDI)                             _ndi._tcp            local
+   eth0 IPv4 GSTREAMER (MyNDI)                             _ndi._tcp            local
+     lo IPv4 GSTREAMER (MyNDI)                             _ndi._tcp            local