Ubuntu Weekly Recipe

第664回 スマートフォンをWebカメラとして使う

この記事を読むのに必要な時間:およそ 5 分

Ubuntuにクライアントをインストールする

スマートフォン側の準備ができたので,今度はUbuntuにDroidCamのクライアントをインストールしましょう。手順は公式のドキュメントに丁寧に記述されています。

v4l2loopbackのインストール

まずは仮想のWebカメラデバイスを作成するためのv4l2loopbackカーネルモジュールが必要です。このカーネルモジュールはアップストリームには取り込まれていないため自分でモジュールをビルドする必要があります※8⁠。幸いなことにv4l2loopback-dkmsパッケージとしてパッケージ化されているため,それをインストールするだけで済みます※9⁠。

※8
DroidCamクライアントのアーカイブにもv4l2loopbackモジュールのコードが同梱されています。設定等をDroidCamに合わせて調整してくれるため,DroidCamでしかv4l2loopbackを使わないのなら選択肢になるでしょう。OBS等でv4l2loopbackを使う予定があるのなら,今回紹介するような,自分で記述する手順のほうが確実です。
※9
サードパーティのモジュールをインストールするには,セキュアブートの設定に注意してください。セキュアブートが有効化されている環境なら,モジュールビルド時に署名が行われパスコードの設定を求められます。このパスコードは次回起動時の電源投入直後に画面から入力する必要があります。もしわずらわしければdmesg | grep -i secureでセキュアブートの状態を確認の上,UEFIメニューからセキュアブートをオフにするというのもひとつの手です。

まずは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 <zmoelnig@iem.at>,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_nrexclusive_capsが正しく設定されていることがわかります。ちなみにv4l2loopbackは,初期設定だと最大8個まで仮想ビデオデバイスを作成可能です。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。