ビデオ会議で画面共有してる間も顔を見せたい

利用しているビデオ会議のシステムによってUIは違いますが、画面共有している間って、相手は共有している画面に注目していて（Google Meetのスポットライトみたいに全画面で表示している場合とか）、こちらの顔が見えにくい、顔も見えている方が雰囲気や意思が伝わりやすいこともあるなと思って、画面共有とカメラと同時に表示できないかなと探してみました。

**Google Meetの画面レイアウトのスポットライト**
<img width="526" alt="Google Meet.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/90277448-90ae-5c13-db8d-8bc9144b74ee.png">

- 試した環境
 - MacBook Pro (16-inch, 2019) (MVVK2J/A)
 - macOS Catalina 10.15.4

# Chromeの拡張機能

まず、Chromeの拡張機能を見つけました。

Webcam Preview
https://chrome.google.com/webstore/detail/webcam-preview/becngjhkfeeldhnjgbgndeedogbnaejg

Googleスライドの画面の右上にカメラの映像を重ねて表示してます（カメラの映像はSnap Cameraで[flash light](https://www.snapchat.com/unlock/?type=SNAPCODE&uuid=d92a8d6095e54e18a46d885b5500ce89&metadata=01)のエフェクトをかけてます）。
<img width="1291" alt="Webcam Preview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/a4dfb96e-dbc2-253b-4bee-3071fb71720f.png">

オプションでカメラ映像の形と位置、映像を反転させるか、タブを切り替えてもカメラ映像を表示するか、全画面表示でもカメラ映像を表示するか、といった設定ができます。
<img width="958" alt="Webcam Preview Options.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/52a3e830-226b-922b-f117-481d02b473d1.png">

これで十分なことも多いのですが、

- Chromeのウィンドウ上に表示されているので、カメラ映像の下にあるボタンを操作できなくなってしまい、使いづらい（右クリックで位置を変えられるけど、面倒くさい）
- Googleスライドでプレゼンテーションを開始すると、カメラ映像が表示されない
- 別のソフトウェアとか全画面とか、ブラウザー以外の画面を表示したい

と対応できない利用シーンもあります。

# OBS Studio

僕のやりたいことって、動画配信してる人がやってることっぽいなと思いつつ、そっち方面は詳しくなくて、うまく探すことができてなかったんですが[^1]、今回久しぶりに探し直して、[OBS Studio](https://obsproject.com/ja)というソフトウェアを発見しました[^2]。

Web会議やリモートワークで「資料も自分も写したい！」ときの方法
https://note.com/hrfr84/n/nf49a373f2b96

を参考にさせてもらいつつ、いろいろ試してみました。

いろいろと処理を頑張ってもらうせいか、結構CPUやメモリーなどリソースを使う気がします。

## シーンを作成する

OBS Studioでは、

- 画面の取り込み
 - ウィンドウキャプチャ（表示したいウィンドウを選ぶ）
 - 画面キャプチャ（カーソルを表示するかどうかの設定や、画面の一部のクロップなどができるようです）
- カメラの取り込み
 - 映像キャプチャデバイス（カメラの選択、サイズ指定）
- 文字や画像
 - テキスト（縁取りも）
 - 画像

といった、さまざまな「ソース」を並べて、「シーン」を作ります。

試しに、ブラウザーのウィンドウとカメラ２つ（実際のカメラとSnap Cameraの仮想カメラ）とテキストを並べたシーンを設定してみました。

最前面から、テキスト（右下の@gofurukawa）、Snap Cameraの仮想カメラ、ブラウザーのウィンドウ、実際のカメラ映像となっているので、実際のカメラ映像の左半分が、ブラウザーのウィンドウに隠れてます。
<img width="1480" alt="OBS Studio 1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/b7db383a-1955-5520-2720-b853c53e2cbd.png">

## プレビューウィンドウを表示して、画面共有する

あとは、「ウィンドウプロジェクター（プレビュー）」を表示して、そのウィンドウを画面共有します。
<img width="305" alt="OBS Studio 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/6db34d87-428e-686f-7c56-6cb2185ffce1.png">

画面共有するプレビューウィンドウを全画面にしたり、OBS Studioに表示するウィンドウを全画面にしたり、なにかを全画面にしようとすると、いろいろと問題があったので、環境によってコツが必要そうです。

- OBS Studioのウィンドウキャプチャのウィンドウ選択では、同じ画面内に選択したいウィンドウがないと選択できないので（最小化もダメ）、全画面表示したいなら、選択した後にする
- Google Meetの画面共有のアプリケーションウィンドウ選択でも、同じ画面内に選択したいウィンドウがないと選択できないので、選択した後で全画面表示する
- Zoomでは画面共有するウィンドウを同じ画面内に表示していないと、画面共有が停止されるので、全画面にできない？（全画面表示にすると、「画面共有は一時停止しました」と表示される）（全画面にできないので、ウィンドウタイトルバーが表示されたままになる）
- マルチディスプレイ環境の場合は、プレビューウィンドウをサブディスプレイに全画面表示して、サブディスプレイを画面共有すると楽かもしれません

あと、うっかり設定してしまって、ハマってしまった設定が１つあります。「プロジェクターを常に手前に表示する」にチェックを入れてしまうと、フローティングウィンドウになってしまうからか、ZoomでもGoogle Meetでも、ウィンドウの一覧に出てこなくなって、画面共有できなくなってしまいました。

<img width="1093" alt="OBS Studio 3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/9359ee7a-bb3a-6ecd-fe6c-89cd0a37b253.png">

というわけで、いろいろと試行錯誤して、Google Meetで画面共有された側の画面キャプチャです。

![Google Meet 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/7e0717c1-2b78-df2e-199f-de3655301efe.png)

## シーンの切り替え

シーンは複数作ることができて、ホットキー（ショートカットキー）を設定すると、キーボード操作だけで、シーンを切り替えることができます。

<img width="1093" alt="OBS Studio 4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/53410919-7385-fe55-4590-82d3e85812f2.png">

- 全画面共有とウィンドウ共有を切り替える
- カメラ映像の有無を切り替える
- 会議の開始前や休憩中に、テキストと画像の表示に切り替える
- 複数のカメラを繋げておいて切り替える

などなど、使い道がありそうです。

だんだん、ビデオ会議というよりも、オンライン講師っぽい用途になってきてる気がしますが……。

# 仮想カメラにしたい

当初の目的（画面共有時にカメラ映像も重ねたい）は達成できたんですが、OBS Studioの処理結果を仮想カメラにすることができれば、いろんな切り替え操作をOBS Studioに集約できそうです（カメラ映像を全面に表示するシーンも設定できるし）。

## OBS Studioのプラグイン

Windowsには、プラグインがあるようです。

OBS-VirtualCam
https://obsproject.com/forum/resources/obs-virtualcam.539/
https://github.com/CatxFish/obs-virtual-cam

macOS用も見つけたのですが、まだproof of conceptレベルのようで、OBS Studioのビルドから始める必要があるようです。

obs-mac-virtualcam
https://github.com/johnboiles/obs-mac-virtualcam

どうやら、OBS Project内で議論中のようなので、いずれ本家にマージされると良いなと思いつつ、導入は見送りました。

Add RFC: Virtual Camera
https://github.com/obsproject/rfcs/pull/15

## ManyCam

ManyCam
https://manycam.com/

ManyCamというソフトウェアだと、処理結果を仮想カメラとして使えるようです。

無料版でも、ウィンドウをソースにして、配置する程度のことはできるので、OBS StudioのプレビューウィンドウをManyCamに取り込む形で、仮想カメラ化できました。

<img width="1168" alt="ManyCam.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20983/4eaaa288-344c-21da-95d0-08fd334ff8c4.png">

ただ、OBS Studioのプレビューウィンドウを全画面にできないので、ウィンドウタイトルバーが表示されたままになる問題がここでも発生してしまいました[^3]。

有料版のManyCamを使えば、OBS Studioなしで単独でやりたいことが実現できて、いろいろ問題が片付きそうな気がします。今回は、無料でできる範囲で試そうと思っているので、深追いせず。

# その他・いろいろ

## Streamlabs OBS

https://streamlabs.com/streamlabs-obs

OBS StudioをベースにStreamlabsというサービスを使えるようにしたしたソフトウェアのようです。僕には不要そうです。

## CamTwist

あとから見つけたCamTwistが今回の用途には最適だったんじゃないかと思ったんですが、CamTwistが依存しているQuartz ComposerってmacOS 10.15 Catalinaで非推奨になってるんですよね。

Macならビデオ会議にCamTwistが最高だから急げ！
https://www.kotobato.jp/articles/audio-visual/camtwist-virtual-video-cam4mac.html

obs-mac-virtualcamの動向を見つつ、試してみるかもしれません。

[^1]: [Snap Camera](https://snapcamera.snapchat.com/)を最近使い始めて、仮想カメラという概念を知ったことが影響してる気もします。
[^2]: OBSというと、[大分放送](http://www.e-obs.com/)と思ってしまいます。子どもの頃、近所に住んでたので。
[^3]: defaults write コマンドで設定できそうな気がするんですが、設定項目の調べ方がわからない……。