LoginSignup
4
5

More than 3 years have passed since last update.

Virtual Webcamを作れるcoremediaio-dal-minimal-exampleをビルドして動かしてみた

Posted at

一時期、Mac版のZoomがVirtualCameraInputを読めなくなっていた時期に少し調べてて、試す前にZoomが復活したのでそのままになっていたところ、真鍋大度さんが実装してたのでまたちょっと気になって調べてみた。

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を設定したら通った。
スクリーンショット 2020-08-19 22.12.07のコピー.png

ちなみにこれはApple Developer Membershipのライセンスを買っているアカウント。
無料アカウントでも通るのかは未確認。

CMIOMinimalSample.pluginを探す

ビルドが通るとProductsのところにpluginファイルが表示されるので、それを選択して、画面右のインスペクタで矢印をクリックすればFinderで表示される
スクリーンショット 2020-08-19 22.16.29.png

CMIOMinimalSample.plugin/Library/CoreMediaIO/Plug-Ins/DAL/へコピー

Finderでの操作でOK

QuickTimeを起動してConsole.appでログを確認

これはやってみたけど該当するログが確認できなかった。

動作確認

QuickTimeの新規ムービー収録で入力ソースにCMIOMinimalSample Deviceが表示されていればOK
スクリーンショット 2020-08-19 22.22.35.png

ちなみにZoomでは認識されなかった。

これから

サンプルは動いたので、あとはここに望みのデータを表示する仕組みを作ればいろいろ遊べそう。
ソース読んだ感じだと、(非常に簡潔なソースで助かります。。。)

  • PlugInInterface.mmでInit/Start/Stop/CopyBufferQueueとかのイベントを外から受け取り
  • Stream.hの各関数を駆動
  • 起動(?)している間Stream::fillFrameが呼ばれ続けることになるので、ここでself.queueに最新の画像のバッファを渡しておけば
  • Stream::copyBufferQueueWithAlteredProcPlugInInterfaceの要求に応じて最新の画像が出せる

という感じかと想像される。

VirtualCameraである以上、このサンプルのようにプラグイン内部で画像を生成しててもしょうがなくて、やっぱり外部から画像を入力できるような仕組みにしたい。
大度さんはxmq:tcpで渡すようにしてるらしい。

で、僕が今作るなら何を使うかなーと考えるとやっぱりNDIなんだけど、それ公式ツールのNDI Virtual Inputで良くね?Zoomでも読めるし。
と気づいたところでモチベーションが落ち、でもせめてやった記録くらいは残しておこうかな・・・と思った次第で書いている記事です。

最後に

手前味噌ですがofxNDIとNDI Virtual Inputを併用すると、自分で書いたoFアプリの出力をVirtual Webcamに渡すことができます。
ちなみにNDIでオーディオも送れます。

zmqでもNDIでもですが、ネットワーク経由でVirtual Inputに画像を渡せるというのは遊びがいがありそうですね。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5