macOS (Mojave、High Sierra) で OBS-Studio をビルドして obs-virtual-camera を試すメモ。

# はじめに
OBS-Studio の obs-mac-virtualcam プラグインを試めすため、macOS で OBS-Studio のビルドでハマったので備忘録を兼ねてメモに残しておきます。
(最終的にはビルドもインストールもうまく行きました！)

<img width="75%" alt="titile.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/72e06679-c9a5-66ad-89e9-2f371bd300d6.png">

(参考)

- ヤマムギさんは手順通りで問題なくインストールできたようです。　　
https://www.yamamanx.com/mac-obs-virtual-camera/

- macOS (Catalina 10.15.3) 環境の事例。　　
https://note.com/junky/n/neeeeddf57bde

- 環境の情報は無いが、これもうまく言っている事例。　　
https://level69.net/archives/27119

- 詳細な情報は無いが、うまく行っている様子。
Zoom の署名を取り除いて仮想カメラを認識させる情報がある。
→ 最新の 5.0.1 でも OK でした。(2020 年 5 月 4 日現在)
https://qiita.com/ketal/items/1aa3bdb0ea7eddd087d4

# ビルド手順

## 環境
- macOS (Mojave 10.14.6)

## 基本的な手順
OBS-Studio のビルド手順は以下のとおりです。

```bash
$ git clone --recursive https://github.com/obsproject/obs-studio.git
$ cd obs-studio
$ brew install FFmpeg x264 Qt5 cmake mbedtls swig
$ mkdir build
$ cd build
$ export QTDIR=/usr/local/opt/qt
$ cmake ..
$ make -j
```

mac-obs-virtual-camera のビルド手順は以下のとおりです。

```bash
$ git clone https://github.com/johnboiles/obs-mac-virtualcam.git
$ cd obs-mac-virtualcam
$ export OBS_DIR=$PWD/../obs-studio
$ mkdir build
$ cd build
$ cmake -DLIBOBS_INCLUDE_DIR:STRING=$OBS_DIR/libobs -DLIBOBS_LIB:STRING=$OBS_DIR/build/libobs/libobs.dylib -DOBS_FRONTEND_LIB:STRING=$OBS_DIR/build/UI/obs-frontend-api/libobs-frontend-api.dylib -DQTDIR:STRING=/usr/local/opt/qt ..
$ make -j
$ cp src/obs-plugin/obs-mac-virtualcam.so $OBS_DIR/build/rundir/RelWithDebInfo/obs-plugins/
$ sudo cp -r src/dal-plugin/obs-mac-virtualcam.plugin /Library/CoreMediaIO/Plug-Ins/DAL
```

OBS-Studio の起動手順は以下のとおりです。

```bash
$ cd $OBS_DIR/build/rundir/RelWithDebInfo/bin
$ ./obs
```

## 追加手順
ビルドに必要なパッケージを追加します。

```bash
$ brew install jack Luajit Jansson SpeexDSP
$ brew cask install vlc
```

zlib と libiconv をインストールします。

```bash
# zlib
$ curl -o zlib-1.2.11.tar.gz https://www.zlib.net/zlib-1.2.11.tar.gz
$ tar xvzf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure
$ make
$ sudo make install

# libiconv
$ curl -o libiconv-1.16.tar.gz https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
$ tar xvzf libiconv-1.16.tar.gz
$ cd libiconv-1.16
$ ./configure
$ make
$ sudo make install
```

## 問題点
１. make で zlib の gzclose_w() でエラー。

```bash
  "_gzclose_w", referenced from:
      _profiler_snapshot_dump_csv_gz in profiler.c.o
ld: symbol(s) not found for architecture x86_64
```

２. make で libiconv の iconv()、iconv_open()、iconv_close() でエラー。

```bash
Undefined symbols for architecture x86_64:
  "_iconv", referenced from:
      _sfnt_name_to_utf8 in find-font-iconv.c.o
  "_iconv_close", referenced from:
      _sfnt_name_to_utf8 in find-font-iconv.c.o
  "_iconv_open", referenced from:
      _sfnt_name_to_utf8 in find-font-iconv.c.o
ld: symbol(s) not found for architecture x86_64
```

３. cmake で VLC video plugin が disabled になってしまう。

```bash
-- Could NOT find LibVLC_INCLUDES (missing: VLC_INCLUDE_DIR) 
-- LibVLC includes not found, VLC video plugin disabled
```

## 原因
１. と ２. はライブラリの問題で、/usr/lib 配下と /usr/local/opt 配下の zlib、iconv には違いがあるためエラーが出ていました。
３. は VLC のインクルードファイルが見つからないため (VLC_INCLUDE_DIR オプションの指定が無いため) エラーが出ていました。

## 対策
cmake 実行時にオプションを指定します。

- -DCMAKE_PREFIX_PATH=/usr/local/opt
- -DVLC_INCLUDE_DIR=/Applications/VLC.app/Contents/MacOS/include/vlc

最終的にビルドが通ったログです。

```bash
$ cmake -DCMAKE_PREFIX_PATH=/usr/local/opt -DVLC_INCLUDE_DIR=/Applications/VLC.app/Contents/MacOS/include/vlc ..
-- OBS_VERSION: 25.0.7-65-g2d14ee3-modified
-- Found FFmpeg: /usr/local/Cellar/ffmpeg/3.2/lib/../lib/libavcodec.dylib (found version "57.64.100") found components: avcodec avdevice avutil avformat 
-- Scripting: Luajit supported
-- Scripting: Python 3 supported
-- Using system Jansson library
-- Found FFmpeg: /usr/local/Cellar/ffmpeg/3.2/lib/../lib/libavformat.dylib (found version "57.56.100") found components: avformat avutil swscale swresample avcodec 
-- Using libavcodec for image loading in libobs
-- Found LibVLC_INCLUDES: /Applications/VLC.app/Contents/MacOS/include/vlc  
-- Found jack: /usr/local/lib/libjack.dylib
-- Using the bundled VST header.
-- Found FFmpeg: /usr/local/Cellar/ffmpeg/3.2/lib/../lib/libavcodec.dylib (found version "57.64.100") found components: avcodec avfilter avdevice avutil swscale avformat swresample 
-- Found FFmpeg: /usr/local/Cellar/ffmpeg/3.2/lib/../lib/libavcodec.dylib (found version "57.64.100") found components: avcodec avutil avformat 
-- Found ftl-sdk: ftl outputs enabled
-- SpeexDSP supported
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/kitazaki/tmp/20200503/obs-studio/build

$ make -j
[  1%] Built target media-playback
[  2%] Built target glad
[  3%] Built target obspython_swig_compilation
[  3%] Built target obslua_swig_compilation
[  8%] Built target syphon-framework
[  8%] Built target obs-ffmpeg-mux
[ 27%] Built target libobs
[ 30%] Built target libobs-opengl
[ 31%] Built target mac-avcapture
[ 32%] Built target image-source
[ 33%] Built target mac-capture
[ 33%] Built target file-updater
[ 34%] Built target obs-x264
Scanning dependencies of target vlc-video
[ 35%] Built target obs-libfdk
[ 42%] Built target obs-outputs
[ 44%] Built target obs-ffmpeg
[ 46%] Built target text-freetype2
[ 48%] Built target obs-transitions
[ 49%] Built target linux-jack
[ 49%] Building C object plugins/vlc-video/CMakeFiles/vlc-video.dir/vlc-video-source.c.o
[ 49%] Automatic MOC for target obs-vst
[ 55%] Built target obs-filters
[ 55%] Building C object plugins/vlc-video/CMakeFiles/vlc-video.dir/vlc-video-plugin.c.o
[ 60%] Built target mac-decklink
[ 60%] Built target mac-syphon
[ 61%] Built target mac-vth264
[ 62%] Built target coreaudio-encoder
[ 62%] Built target obs-vst_autogen
[ 62%] Built target obs-frontend-api
[ 64%] Built target obs-vst
[ 64%] Automatic MOC for target obs
[ 65%] Built target rtmp-services
[ 68%] Built target obs-scripting
[ 68%] Automatic MOC for target decklink-ouput-ui
[ 68%] Built target obs_autogen
[ 69%] Built target obslua
[ 69%] Built target _obspython
[ 69%] Automatic MOC for target frontend-tools
[ 69%] Built target decklink-ouput-ui_autogen
[ 69%] Built target frontend-tools_autogen
[ 72%] Built target decklink-ouput-ui
[ 77%] Built target frontend-tools
[ 99%] Built target obs
[100%] Linking C shared module vlc-video.so
[100%] Built target vlc-video
```