はじめに
FFmpeg 3.4 で NDI がサポートされましたが、その後 NewTek 社が GPL ライセンス違反で適切な対応が取られなかったことで、FFmpeg 4.1系以降から NDI のサポートが削除されました。
(参考)
https://trac.ffmpeg.org/ticket/7589
https://patchwork.ffmpeg.org/project/ffmpeg/patch/CAB0OVGpkpyFzmkuC+kO3-Er3iNYH9hpO4zDTQZbRpEyFu=fjuQ@mail.gmail.com/
FFmepg 4.0 系でビルドする手順
FFmpeg 4.0 系 (4.0 系の最終 4.0.5) であれば適切な NDI SDK ライブラリを組み込めば問題なくビルドできます。
(参考)
https://qiita.com/kitazaki/items/eeb710a78c657024f844
https://qiita.com/kitazaki/items/8b1f730903d3a62025e9
FFmpeg 4.1 系以降でビルドする方法
FFmpeg 4.2 系 (2020 年 4 月 29 日時点の最終 4.2.2) で NDI SDK ライブラリを組み込んでビルドする手順です。
手掛かりは FFmpeg 4.1 で NDI に関連するソースコードが削除された履歴 (Patch) です。
削除されたコードを最新のソースツリーに反映することで NDI SDK ライブラリを組み込めば問題なくビルドできました。
最初に FFmpeg 4.2 系 (2020 年 4 月 29 日時点の最終 4.2.2) のソースコードをダウンロードします。
$ git clone git://source.ffmpeg.org/ffmpeg.git -b release/4.2 --depth=1
$ cd ffmpeg
1. configure ファイルを修正する
以下はパッチファイルです。先頭が '-' で始まる赤字の部分を configure ファイルに追加します。
@@ -297,7 +297,6 @@ External library support:
--enable-lv2 enable LV2 audio filtering [no]
--disable-lzma disable lzma [autodetect]
--enable-decklink enable Blackmagic DeckLink I/O support [no]
- --enable-libndi_newtek enable Newteck NDI I/O support [no]</font>
--enable-mbedtls enable mbedTLS, needed for https support
if openssl, gnutls or libtls is not used [no]
--enable-mediacodec enable Android MediaCodec support [no]
@@ -1675,7 +1674,6 @@ EXTERNAL_LIBRARY_GPL_LIST="
EXTERNAL_LIBRARY_NONFREE_LIST="
decklink
- libndi_newtek
libfdk_aac
openssl
libtls
@@ -3256,10 +3254,6 @@ decklink_indev_extralibs="-lstdc++"
decklink_outdev_deps="decklink threads"
decklink_outdev_suggest="libklvanc"
decklink_outdev_extralibs="-lstdc++"
-libndi_newtek_indev_deps="libndi_newtek"
-libndi_newtek_indev_extralibs="-lndi"
-libndi_newtek_outdev_deps="libndi_newtek"
-libndi_newtek_outdev_extralibs="-lndi"
dshow_indev_deps="IBaseFilter"
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi"
fbdev_indev_deps="linux_fb_h"
@@ -6064,7 +6058,6 @@ enabled cuda_sdk && require cuda_sdk cuda.h cuCtxCreate -lcuda
enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint
enabled decklink && { require_headers DeckLinkAPI.h &&
{ test_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a090500" || die "ERROR: Decklink API version must be >= 10.9.5."; } }
-enabled libndi_newtek && require_headers Processing.NDI.Lib.h
enabled frei0r && require_headers frei0r.h
enabled gmp && require gmp gmp.h mpz_export -lgmp
enabled gnutls && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init
次に libavdevice ディレクトリへ移動します。
$ cd libavdevice
2. libavdevice/Makefile ファイルを修正する
以下はパッチファイルです。先頭が '-' で始まる赤字の部分を Makefile ファイルに追加します。
@@ -20,8 +20,6 @@ OBJS-$(CONFIG_BKTR_INDEV) += bktr.o
OBJS-$(CONFIG_CACA_OUTDEV) += caca.o
OBJS-$(CONFIG_DECKLINK_OUTDEV) += decklink_enc.o decklink_enc_c.o decklink_common.o
OBJS-$(CONFIG_DECKLINK_INDEV) += decklink_dec.o decklink_dec_c.o decklink_common.o
-OBJS-$(CONFIG_LIBNDI_NEWTEK_OUTDEV) += libndi_newtek_enc.o
-OBJS-$(CONFIG_LIBNDI_NEWTEK_INDEV) += libndi_newtek_dec.o
OBJS-$(CONFIG_DSHOW_INDEV) += dshow_crossbar.o dshow.o dshow_enummediatypes.o \
dshow_enumpins.o dshow_filter.o \
dshow_pin.o dshow_common.o
3. libavdevice/libndi_newtek_common.h、libndi_newtek_dec.c、libndi_newtek_enc.cファイルを追加する
ファイルをダウンロードします。
$ wget https://raw.githubusercontent.com/kitazaki/ffmpeg_NDI/master/libndi_newtek_common.h
$ wget https://raw.githubusercontent.com/kitazaki/ffmpeg_NDI/master/libndi_newtek_dec.c
$ wget https://raw.githubusercontent.com/kitazaki/ffmpeg_NDI/master/libndi_newtek_enc.c
4. libavdevice/alldevices.c ファイルを修正する
以下はパッチファイルです。先頭が '-' で始まる赤字の部分を alldevices.c ファイルに追加します。
@@ -32,8 +32,6 @@ extern AVInputFormat ff_bktr_demuxer;
extern AVOutputFormat ff_caca_muxer;
extern AVInputFormat ff_decklink_demuxer;
extern AVOutputFormat ff_decklink_muxer;
-extern AVInputFormat ff_libndi_newtek_demuxer;
-extern AVOutputFormat ff_libndi_newtek_muxer;
extern AVInputFormat ff_dshow_demuxer;
extern AVInputFormat ff_fbdev_demuxer;
extern AVOutputFormat ff_fbdev_muxer;
以上で NDI に関連するソースコードの反映は完了です。
$ cd ..
別途、NDI SDK ライブラリをダウンロード、インストールしてビルドします。
(参考: NDI SDK ライブラリをダウンロード、インストール)
https://qiita.com/kitazaki/items/eeb710a78c657024f844
https://qiita.com/kitazaki/items/8b1f730903d3a62025e9
$ ./configure --enable-nonfree --enable-libndi_newtek --extra-cflags="-I/usr/include/ndi/" --extra-ldflags="-L/usr/include/ndi/" --enable-libx264 --enable-gpl
Jetson Nano で NVMPI の有効化と合わせて NDI を組み込むことも可能です。
(参考: Jetson Nano で NVMPI を有効化する場合)
https://qiita.com/kitazaki/items/02298356703418450dcc
$ ./configure --enable-nvmpi --enable-nonfree --enable-libndi_newtek --extra-cflags="-I/usr/include/ndi/" --extra-ldflags="-L/usr/include/ndi/" --enable-libx264 --enable-gpl