一時期、Mac版のZoomがVirtualCameraInputを読めなくなっていた時期に少し調べてて、試す前にZoomが復活したのでそのままになっていたところ、真鍋大度さんが実装してたのでまたちょっと気になって調べてみた。
openFrameworksのTextureをWebCamとして認識するaddon, ofxGL2Webcamを作ったのでこれを使いたいところ。 Syphon経由ではないところがミソ。 pic.twitter.com/NICu4C85TG
— Daito Manabe (@daitomanabe) August 18, 2020
CoreMediaIO-DAL-Example
まずはこれに行き着いたけど、なんとかビルドと実行はできたものの、僕が何か誤解してるのか、VirtualInputは作られなかった。
https://github.com/lvsti/CoreMediaIO-DAL-Example
ビルドと実行を通すまでのメモはこの中に
DLしてSampleをビルド
ld: can't open -sectcreate file: /Users/nariakiiwatani/Downloads/CoreMediaIO-DAL-Example-master/BuildSystem/XcodeProjects/../../Sources/Extras/CoreMediaIO/DeviceAbstractionLayer/Devices/Sample/KernelExtension/ntsc2vuy720x480.yuv
clang: error: linker command failed with exit code 1 (use -v to see invocation)
データがないっぽい
https://github.com/lvsti/CoreMediaIO-DAL-Example/issues/7
リポジトリから削除したとのことなので、書いてある通りここからオリジナルのサンプルをDL(画面左上あたり)
https://developer.apple.com/library/archive/samplecode/CoreMediaIO/Introduction/Intro.html
ビルド通った。
他ターゲットもビルドしていく
SampleVcamAssistantで実行時エラー
"/Library/CoreMediaIO/Plug-Ins/DAL/SampleVCam.plugin/Contents/Resources/ntsc2vuy720x480.yuv"がない
見てみたけどそもそも/Library/CoreMediaIO/Plug-Ins/DAL/にSampleVCam.pluginがない
SampleVCam.pluginのビルド設定をみる
BuildResultsフォルダにビルドされるようだが、Libraryにコピーするのはどこでやってる?
Deployment -> Installation Directoryにそれらしき設定があった
このリンク先によるとInstallationはxcodebuild install時にされるもの?
https://stackoverflow.com/questions/636810/mac-osx-xcode-installation-directory
xcodebuild -project [xcodeprojへのパス] install
を実行
** INSTALL SUCCEEDED **
やった
でもやっぱり/Library/CoreMediaIO/Plug-Ins/DAL/にSampleVCam.pluginは作られてない
sudo xcodebuild ~~~
してみてもだめ
おそるおそる手動でコピーしてみると
SampleVCam Assistantのビルドでエラー
error: unable to open output file '/Users/nariakiiwatani/Downloads/CoreMediaIO-DAL-Example-master/BuildResults/Sample.build/Debug/SampleVCam Assistant.build/Objects-normal/x86_64/CACFArray.o': 'Operation not permitted'
クリーンアップしたら通った。実行できた。
しかしQuickTimeでもZoomでも認識されていないよう。
いったん掘るのを止める
coremediaio-dal-minimal-example
これを見つけたので試してみる
https://github.com/johnboiles/coremediaio-dal-minimal-example
READMEにある通りにやれば動いた。
To try this out:
- Build it in Xcode
- Find CMIOMinimalSample.plugin in Xcode's 'Products' folder
- Right click CMIOMinimalSample.plugin and choose 'Show in Finder'
- Copy the plugin bundle to /Library/CoreMediaIO/Plug-Ins/DAL/
- Open QuickTime
- Watch the logs in Console.app for any logs prefixed with CMIOMS
You may also need to change the codesigning to use your own personal developer identity.
せっかくなので記録しておく。
Xcodeでビルド
CMIOMinimalSample.xcodeproj
をXcodeで開いてビルド。
ビルドターゲットはCMIOMinimalSample
ひとつしかないのでそれでOK。
未サインイン状態だったのでCodesignのエラーが出たが、Signingを設定したら通った。
ちなみにこれはApple Developer Membershipのライセンスを買っているアカウント。
無料アカウントでも通るのかは未確認。
CMIOMinimalSample.plugin
を探す
ビルドが通るとProductsのところにpluginファイルが表示されるので、それを選択して、画面右のインスペクタで矢印をクリックすればFinderで表示される
CMIOMinimalSample.plugin
を/Library/CoreMediaIO/Plug-Ins/DAL/
へコピー
Finderでの操作でOK
QuickTime
を起動してConsole.app
でログを確認
これはやってみたけど該当するログが確認できなかった。
動作確認
QuickTimeの新規ムービー収録で入力ソースにCMIOMinimalSample Device
が表示されていればOK
ちなみにZoomでは認識されなかった。
これから
サンプルは動いたので、あとはここに望みのデータを表示する仕組みを作ればいろいろ遊べそう。
ソース読んだ感じだと、(非常に簡潔なソースで助かります。。。)
- PlugInInterface.mmでInit/Start/Stop/CopyBufferQueueとかのイベントを外から受け取り
- Stream.hの各関数を駆動
- 起動(?)している間
Stream::fillFrame
が呼ばれ続けることになるので、ここでself.queue
に最新の画像のバッファを渡しておけば -
Stream::copyBufferQueueWithAlteredProc
でPlugInInterface
の要求に応じて最新の画像が出せる
という感じかと想像される。
VirtualCameraである以上、このサンプルのようにプラグイン内部で画像を生成しててもしょうがなくて、やっぱり外部から画像を入力できるような仕組みにしたい。
大度さんはxmq:tcp
で渡すようにしてるらしい。
It's DAL plugin. I recommend to check this example. https://t.co/DNqvNNZNy5 the openFrameworks app sends texture data to DAL plugin via zmq:tcp :) https://t.co/jJzC5OYXNt
— Daito Manabe (@daitomanabe) August 19, 2020
で、僕が今作るなら何を使うかなーと考えるとやっぱりNDIなんだけど、それ公式ツールのNDI Virtual Input
で良くね?Zoomでも読めるし。
と気づいたところでモチベーションが落ち、でもせめてやった記録くらいは残しておこうかな・・・と思った次第で書いている記事です。
最後に
手前味噌ですがofxNDIとNDI Virtual Inputを併用すると、自分で書いたoFアプリの出力をVirtual Webcamに渡すことができます。
ちなみにNDIでオーディオも送れます。
zmqでもNDIでもですが、ネットワーク経由でVirtual Inputに画像を渡せるというのは遊びがいがありそうですね。