リモートワーク時代の三種の神器のひとつがリモートミーティング用のWebカメラです。今回はWebカメラとしてスマートフォンを使ってみましょう。
スマートフォンをWebカメラ化する「DroidCam」
リモートワークでは個々の勤務地が物理的に離れたところになるため、どのようにコミュニケーションを取るかが重要な要素となってきます。とは言え、ネットワーク越しのコミュニケーションはパソコン通信・インターネットの世界においては当然のごとく行われてきました。
電子メールや電子掲示板など文字中心のやりとりも、チャット[1] やインスタントメッセンジャー[2] のようにリアルタイム性の高いもの、各種SNS[3] やアバター・音声・動画[4] による通話などが登場します。インターネットの普及と回線の増強に伴い、できるだけリアルタイムに、声や顔も見える形のコミュニケーション手段が充実していったのです。
どの手段も「メインに利用していた世代」がいるので、その人を捕まえられればいろいろとコミュニケーションに関する面白い話を聞けることでしょう。そして2021年の現役世代から面白い話を聞ける可能性が高いのは「リモートワークのための環境構築」話となります。
今回紹介するのはそんなリモートワーク環境における三種の神器のひとつである「Webカメラ話」です[5] 。
実際のところリモートのミーティングにおいては、ノートPCについているWebカメラで十分です。一般的に、相手側に映る映像もそこまで解像度は高くありません。しかしながらPCにカメラがついてないこともあるでしょうし、そもそもリモートミーティングの負荷が高いために、より高性能なデスクトップマシンで動かしたいという要望もあるでしょう。そうすると何らかの外部カメラが必要になります。
もちろん普通のWebカメラだけでなく、ビデオカメラや一眼レフカメラといったより高性能なカメラを使うという方法もあります。第619回の「HDMIキャプチャーボードでZoomへの配信映像を加工する 」などで紹介しているように、デバイスのHDMI出力をPC側に入力しWebカメラ化、それをミーティングソフトで出力・共有する方法です。しかしながらよっぽどのお金持ちか、子どもがいる家庭でもない限り、ビデオカメラや一眼レフカメラ持っていることはまれしょう。
しかしながらそんなご家庭にも、おそらく常備されているであろう「外部カメラ」が存在します。そうスマートフォンですね[6] 。
[6] ハイエンドな一眼レフカメラやレンズほどではないものの、カメラ性能が高いスマートフォンもそれなりに高価な品物です。なお、いわゆる「ガラケー」と呼ばれる古い機種は今回の用途にはおそらく使えません。よってスマートフォンも持っていない場合は、素直にWebカメラを買いましょう。「 授業のためにリモートミーティングしないといけないからスマホ買って」はおそらく通じません。
スマートフォンをWebカメラ化するアプリケーションはたくさん存在します。基本はスマートフォン側にアプリケーションをインストールし、USBやWiFiを経由してPCと通信し、PC側の専用クライアントを経由してOS側にマイク付きのWebカメラとして見せる、という流れになります。その中で今回は「DroidCam 」を紹介しましょう。実はDroidCamには、公式のLinuxクライアントが用意されているからです。
DroidCamのスマートフォン向けアプリケーションはFLOSSではないものの、Linux版クライアントのほうはGitHubでGPL2ライセンスのソースコードが公開されています 。必要に応じて自分でカスタマイズすることも可能なので、いろいろな用途に使えるでしょう。またOBS用のプラグイン も存在するようです。
さらに有償版のDroidCamX を購入すると、広告の非表示や解像度の向上などを含む機能の強化が行われます。
スマートフォン側にアプリケーションをインストールする
まずはDroidCamをスマートフォンにインストールしましょう。といっても普通にアプリケーションをインストールするだけです。ここから先はAndroid版 を想定して話を進めます。
図1 起動するとまずヘルプが 表示される
起動するとまずはヘルプが表示されます。また写真と動画、音声の録音に対する機能を許可してください。
そうすると次のようなIPアドレスとURLを表示します。URLはDroidCamが、USB経由だけでなくHTTP over WiFi経由でもカメラ機能を提供しているためです。つまりIPカメラ的な使い方も可能になっています。言い方を変えると、初期設定ではDroidCamを起動したスマートフォンのIPアドレスさえわかれば、だれでもそのカメラの映像を参照できるのです[7] 。
図2 準備ができるとアクセス用の IPアドレス等が表示される
気になるようなら画面右上のケバブメニュー(縦に3個のドットが並んでいるボタン)から設定を選び、「 IP Webカメラ」のユーザー名やパスワードを設定しておくと良いでしょう。残念ながらIPカメラ機能そのものをオフにする方法は存在しないようです。
ちなみにケバブメニューの左にあるアイコンをクリックすると、リアとインのどちらのカメラを使うかを選択できます。
動作確認を兼ねて、「 IP Cam Access」のURLにアクセスしてみましょう。「 /video
」はMJPEGによる配信のようなのでVLCなどのMJPEGに対応したソフトウェアが必要です。Webブラウザーなら「/video
」なしにアクセスすると良いでしょう。
図3 スマートフォンのカメラの映像を表示しているPCをスマートフォンのカメラで写している状態をスクリーンショットで撮影
DroidCamはランドスケープモード(横置きの映像)での配信のみに対応しているようです。普通にスマートフォンを縦置きのままカメラを向けると映像が90度回転してしまうので注意してください。
Ubuntuにクライアントをインストールする
スマートフォン側の準備ができたので、今度はUbuntuにDroidCamのクライアントをインストールしましょう。手順は公式のドキュメント に丁寧に記述されています。
v4l2loopbackのインストール
まずは仮想のWebカメラデバイスを作成するためのv4l2loopback カーネルモジュールが必要です。このカーネルモジュールはアップストリームには取り込まれていないため 、自分でモジュールをビルドする必要があります[8] 。幸いなことにv4l2loopback-dkmsパッケージとしてパッケージ化されているため、それをインストールするだけで済みます[9] 。
[8] DroidCamクライアントのアーカイブにもv4l2loopbackモジュールのコードが同梱されています。設定等をDroidCamに合わせて調整してくれるため、DroidCamでしかv4l2loopbackを使わないのなら選択肢になるでしょう。OBS等でv4l2loopbackを使う予定があるのなら、今回紹介するような、自分で記述する手順のほうが確実です。
まずはv4l2loopbackモジュールをインストールします。今回はモジュールだけインストールしていますが、OBSなど他のアプリケーションからもv4l2loopbackを使う予定があるなら、CLIツールであるv4l2loopback-utilsパッケージも一緒にインストールしておくと良いかもしれません。
$ sudo apt install v4l2loopback-dkms
(中略)
v4l2loopback.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/5.4.0-72-generic/updates/dkms/
depmod....
DKMS: install completed.
man-db (2.9.1-1) のトリガを処理しています ...
まずはv4l2loopbackモジュールをロードしてみましょう。今回は特に何もオプションを指定していません。
$ sudo modprobe v4l2loopback
「/dev/video2
」というファイルが作られているはずです。数字の部分は環境によって異なります。試した環境はすでにカメラが存在していたので、次のようになりました。
$ ls -l /sys/class/video4linux/
合計 0
lrwxrwxrwx 1 root root 0 4月 25 12:10 video0 -> ../../devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/video4linux/video0
lrwxrwxrwx 1 root root 0 4月 25 12:10 video1 -> ../../devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/video4linux/video1
lrwxrwxrwx 1 root root 0 4月 25 12:10 video2 -> ../../devices/virtual/video4linux/video2
このモジュールはいくつかのオプションが存在します。
$ modinfo v4l2loopback
filename: /lib/modules/5.4.0-72-generic/updates/dkms/v4l2loopback.ko
license: GPL
author: Vasily Levin, IOhannes m zmoelnig <[email protected] >,Stefan Diewald,Anton Novikovet al.
description: V4L2 loopback video device
srcversion: 095910A620FCC8E21E38880
depends: videodev
retpoline: Y
name: v4l2loopback
vermagic: 5.4.0-72-generic SMP mod_unload modversions
parm: debug:debugging level (higher values == more verbose) (int)
parm: max_buffers:how many buffers should be allocated (int)
parm: max_openers:how many users can open loopback device (int)
parm: devices:how many devices should be created (int)
parm: video_nr:video device numbers (-1=auto, 0=/dev/video0, etc.) (array of int)
parm: card_label:card labels for every device (array of charp)
parm: exclusive_caps:whether to announce OUTPUT/CAPTURE capabilities exclusively or not (array of bool)
parm: max_width:maximum frame width (int)
parm: max_height:maximum frame height (int)
よく使うオプションをいくつか紹介しましょう。
devices
仮想ビデオデバイスをいくつ作るかをいくつ作るかを指定します。たとえば/dev/video1
まで存在する環境でdevices=3
を指定すると、/dev/video2
、/dev/video3
、/dev/video4
が作られます。
video_nr
ビデオデバイス番号を指定して作成します。たとえばvideo_nr=3,5,6
と指定すると、/dev/video3
、/dev/video5
、/dev/video6
が作られます。特定のデバイス名を特定の機能に紐づけたいときに便利です。
card_label
デバイスごとにアプリケーションから見える名前を指定します。たとえばvideo_nr=3,5
と指定している状況で、「 card_label="OBS","DroidCam"
」と指定すると、アプリケーションからは/dev/video3
が「OBS」と、/dev/video5
が「DroidCam」と表示されます。指定しない場合は、「 Dummy video device (0x0003)」のように表示されます。
exclusive_caps
v4l2loopbackで作られたダミーデバイスは、ioctl(VIDIOC_QUERYCAP)
に対して常に「V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT
」を返します。それに対してexclusive_caps
に1を設定しておくと、デバイスごとのcapabilityを返すようになります。ChromeなどいくつかのWebカメラを使うソフトウェアは、1を設定する必要があるようです。ちなみにLinuxクライアント版のZoomではなくても問題ありませんでした。
一度ロードしたモジュールをアンロードして、/dev/video5
を作るように、オプションを設定してみましょう。ついでに起動時に自動ロードするようにしておきます。
$ sudo modprobe -r v4l2loopback
$ cat <<EOF | sudo tee /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback video_nr=5 card_label="DroidCam" exclusive_caps=1
EOF
$ echo "v4l2loopback" | sudo tee /etc/modules-load.d/v4l2loopback.conf
$ sudo modprobe v4l2loopback
$ cat /sys/module/v4l2loopback/parameters/video_nr
5,-1,-1,-1,-1,-1,-1,-1
$ cat /sys/module/v4l2loopback/parameters/exclusive_caps
Y,N,N,N,N,N,N,N
また、video_nr
やexclusive_caps
が正しく設定されていることがわかります。ちなみにv4l2loopbackは、初期設定だと最大8個まで仮想ビデオデバイスを作成可能です。
DroidCamクライアントのインストール
次にDroidCamをインストールします。ソースコードは公開されているものの、今回は配布されているバイナリそのものを利用します。
$ cd /tmp
$ wget -O droidcam_latest.zip https://files.dev47apps.net/linux/droidcam_1.7.2.zip
$ unzip droidcam_latest.zip -d droidcam
$ cd droidcam
最新のバージョンは公式のドキュメント を参照してください。さらにインストールスクリプトを実行します。
$ sudo ./install-client
この「install-client
」は単にバイナリやリソースを「/opt
」や「/usr/bin
」などにコピーしているだけのシンプルなスクリプトです。必ずスクリプトの内容が問題ないことを確認してから、実行してください。
ここまででDroidCamのクライアントがインストールされました[10] 。
[10] ちなみに同ディレクトリにある「install-sound
」を実行すると、スマートフォンのマイクをWebカメラのマイクとして利用できることになっています。これはsnd-aloopというカーネルモジュールとALSAの機能を使って実現しています。ただし筆者の環境だと、うまく音声を取得できなかったので今回は説明を省いています。
DroidCamを使ってみる
Ubuntuから「Super+a」キーを押してアプリケーションの検索画面を開き「droidcam」を入力します。ドロイド君のアイコンが表示されるのでそれを選択するとDroidCamのクライアントが起動します。
図4 DroidCamクライアントのUIはシンプル
「WiFi / LAN」を選択して「Phone IP」にDroidCamアプリ側に表示されているIPアドレスを入力し、Startボタンを押すだけです。これでスマートフォンのカメラの映像がUbuntu上の仮想ビデオデバイスに入力されるようになりました。あとは任意のWebカメラを使うアプリケーションで表示すれば良いわけです。たとえばZoomクライアントだと次のような感じで表示されました。
図5 Zoomの設定画面の様子
ものによっては左右や上下が逆転しているため、カメラ側かZoomクライアントのようなソフトウェア側のどちらかで適宜調整してください。DroidCam側からは有償版のみ設定可能です。
無料版のDroidCamは解像度が640x480の4:3固定です。よって品質はそこまで期待できません。リモートミーティング用のカメラなのでそれでも大丈夫でしょう。有償版を購入すると1280x720(4:3)や1920x1080(16:9)も選択できます。
DroidCamクライアントの「USB」を選択するとUSBケーブル経由の通信も可能です。Androidの場合、Ubuntuにadbコマンドが必要になるため、adbパッケージをインストールしてください。また、Android側も「USBデバッグモード」を有効化しておく必要があります。
「Wifi Server Mode」は有償版のみの機能です。PC側をサーバーにして、スマートフォン側で受信する仕組みのようです。
これで急遽Webカメラが必要になった場合も、スマートフォンがあればなんとか対応できることがわかりました。特にDroidCamはWiFi経由で、つまり無線通信でカメラ映像を転送してくれるため、PCから離れたものを映したくなったときに最適です。また、DroidCamクライアントにはCLI版のdroidcam-cli
も用意されているため、CLI環境でスマートフォンをWebカメラとして接続し、さらに何かに転送したい場合もDroidCamを利用できます。
ちなみに、DroidCamクライアントが不要になった場合は次のコマンドでアンインストールしてください。
$ sudo /opt/droidcam-uninstall