OBSの起動までコードリーディングをしたので今回は個人的に一番興味のあった仮想カメラの仕組みについて調べたことをまとめていきます。(前回リンク)
(OBS StudioのVer30、windows64用の処理を参照)
DirectShowを使った仮想カメラの概要
OBSでは仮想カメラ機能があり、ZOOMやTeams側でusbカメラのように認識させて映像を流す事ができます。
この機能はOBS version 26.0.0から標準で入っていて、それ以前のバージョンではobs-virtual-camというプラグインのプロジェクトで提供されていました。
この外部プラグインについての解説は見つかったのですが、標準機能になってからのシステム概要について詳細な記事が無かったので公開します。
DirectShowを使った仮想カメラの作り方が知りたい場合は下記の記事で詳細な解説や実装が公開されています。
- DirectShowによる仮想カメラ開発のメモ
- DirectShowで仮想カメラを自作しよう
- 仮想カメラの実装サンプル1 : NMVCamFilter
- 仮想カメラの実装サンプル2 : DirectShow VCam
OBS v30の仮想カメラ | システム概要図
OBSが生成するモジュールの詳細は:OBS Studio コードリーティング日記 #5
図のシステムを3ステップで説明すると下記のようになります。
- OBSのメイン機能側でwin-dshow.dllをプラグインとして扱う。(startやupdate等を管理)
- OBSの映像(フレーム)を.dllファイルが取得し共有メモリに書き込む。
- 共有メモリに書き込まれた映像(フレーム)を仮想カメラとして動作しているobs-virtualcam-module.dllが読み込み、対象のアプリへカメラとして映像を配信。
仮想カメラ(obs-virtualcam-module.dll)はインストール時にvirtualcam-install.batというファイルでレジストリに登録されます。(OBSをアンインストールする際はレジストリの削除を忘れずに。)
よって、OBSが起動していなくてもZOOMやTeamsからはOBSの仮想カメラを選択することができますが、その場合は上図のplaceholder.pngという画像が流されます。
仮想カメラ(obs-virtualcam-module.dll)が使われているかどうかはコマンドプロンプトでtasklistコマンドを打つとカメラを使用しているアプリの確認出来ます。
C:\Users>tasklist /m obs-virtualcam-module64.dll
イメージ名 PID モジュール
========================= ======== ============================================
teams.exe 31276 obs-virtualcam-module64.dll
OBS v30の仮想カメラ | プロジェクト構成
ソリューションファイルを開くと下記のようなプロジェクト構成になっています。
ビルドを実行するとobs-virtualcam-module.dllとwin-dshow.dllの2ファイルが生成。
どちらのdllも参照モジュールとしてlibdshowcaptureを読み込んでいますが、このプロジェクトは非参照のみで共有ファイルは生成されません。
下図はwin-dshowプラグイン内の各ファイルの役割を大まかにまとめたもの。
今回はとりあえずここまで。