リモートワークも定着し、何を映すかはともかくとして、Webカメラを常備している人も多いことでしょう。そもそもノートPCならほぼ標準搭載の機能ではあります。これらのWebカメラはUSB Video Class
UVCのドライバーとツールを開発するVideo for Linux
Video for Linux
2012年当時はv4l2ucpは十分に機能していましたが、これはQt4を使っているツールであり、ほぼQt5に移行しきって、そろそろQt6対応が進み始めている今となっては古いアプリケーションになりました。実際Debianリポジトリ側では、Qt4の削除に伴いv4l2ucpパッケージもリポジトリから削除されています。たとえばUbuntu 22.
一応、Qt5に対応したバージョンも存在する
ちなみに他のツールとしては第303回で紹介した定番の
では、早速camsetインストールしてみましょう。手順としてはcamsetを動かすために必要なパッケージをインストールして、Pythonの流儀でパッケージをインストールするだけです。
$ sudo apt install v4l-utils pkg-config pipx $ pipx install camset
pipxは~/.locah/
」~/.local/
」~/.local/
」$PATH
に~/.local/
」~/.local/
」$PATH
にそのパスを追加してくれます。ただし初めてpipxを実行したときなど、~/.local/
」$PATH
は未更新です。そういう場合は、一度ログアウトしてログインし直すといいでしょう。
さらにcamsetには、アイコンファイルとdesktopファイルも用意されています。GNOME Shellのアプリケーション検索画面からcamsetを検索して表示するためには、これを次のように登録します。
アイコンファイルのサイズ確認 $ file ~/.local/pipx/venvs/camset/share/icons/camset.png .local/pipx/venvs/camset/share/icons/camset.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced 256x256なのでそれを指定してインストール $ xdg-icon-resource install --novendor --size 256 ~/.local/pipx/venvs/camset/share/icons/camset.png desktopファイルをインストール $ desktop-file-install --dir=~/.local/share/applications/ ~/.local/pipx/venvs/camset/share/applications/camset.desktop
最後のコマンドでは"Desktop Entry" is an icon name with an extension
」
これでアプリケーション検索画面で
プレビュー画面は設定ウィンドウの設定に合わせてリアルタイムで反映されます。ちなみにカメラの映像デバイスは、ひとつのアプリケーションでしか利用できません。よってたとえばZoomの映像の状態を確認したいのであれば、プレビュー画面だけ閉じてしまって、Zoomで適当なミーティングを開始し、そちらのカメラ映像を見ながら設定しましょう。ただし設定ウィンドウの左側は、他のアプリだと調整できないようです。
設定用ウィンドウは、原則としてデバイスがサポートのみ設定を変更できます。また、いくつかの項目は条件が満たされたときのみ操作可能です。代表的なものをいくつか説明していきましょう。
「Power Line Frequency」
「Brightness」
「Backlight Compensation」
「Pan Absolute」
「Save settings」~/.config/
」
CLIで操作する「v4l2-ctl」
camsetはバックエンドとしてv4l2-ctlコマンドを利用しています。V4L2はioctlなどからも操作できますが、v4l2-ctlコマンドでも一通りの操作が可能です。まずはその操作方法を見ていきましょう。まずV4L2に対応したカメラデバイスの一覧を表示します。
$ v4l2-ctl --list-devices Logitech StreamCam (usb-0000:3d:00.0-2): /dev/video0 /dev/video1 /dev/media0
デバイスは1台だけなのですが、デバイスファイルは3種類あるようです。今回のケースだと、/dev/
がカメラ本体の操作用で、/dev/
がメタデータ用、/dev/
が実際に映像データをやりとりするデバイスとなります。これは次のコマンドでも確認できます。
$ v4l2-ctl -d /dev/video0 --all Driver Info: Driver name : uvcvideo Card type : Logitech StreamCam (中略) Device Caps : 0x04200001 Video Capture Streaming Extended Pix Format (中略) Video input : 0 (Input 1: ok) Format Video Capture: Width/Height : 640/480 Pixel Format : 'YUYV' (YUYV 4:2:2) (中略) User Controls brightness 0x00980900 (int) : min=0 max=255 step=1 default=128 value=128 contrast 0x00980901 (int) : min=0 max=255 step=1 default=128 value=128 saturation 0x00980902 (int) : min=0 max=255 step=1 default=128 value=128 white_balance_automatic 0x0098090c (bool) : default=1 value=1 gain 0x00980913 (int) : min=0 max=255 step=1 default=0 value=0 power_line_frequency 0x00980918 (menu) : min=0 max=2 default=2 value=2 (60 Hz) 0: Disabled 1: 50 Hz 2: 60 Hz white_balance_temperature 0x0098091a (int) : min=2000 max=7500 step=1 default=4000 value=5142 flags=inactive sharpness 0x0098091b (int) : min=0 max=255 step=1 default=128 value=128 backlight_compensation 0x0098091c (int) : min=0 max=1 step=1 default=0 value=0 Camera Controls auto_exposure 0x009a0901 (menu) : min=0 max=3 default=3 value=3 (Aperture Priority Mode) 1: Manual Mode 3: Aperture Priority Mode exposure_time_absolute 0x009a0902 (int) : min=3 max=2047 step=1 default=250 value=333 flags=inactive exposure_dynamic_framerate 0x009a0903 (bool) : default=0 value=0 pan_absolute 0x009a0908 (int) : min=-36000 max=36000 step=3600 default=0 value=0 tilt_absolute 0x009a0909 (int) : min=-36000 max=36000 step=3600 default=0 value=0 focus_absolute 0x009a090a (int) : min=0 max=255 step=1 default=0 value=30 flags=inactive focus_automatic_continuous 0x009a090c (bool) : default=1 value=1 zoom_absolute 0x009a090d (int) : min=100 max=400 step=1 default=100 value=100
最初の
「User Controls」v4l2-ctl -d /dev/
」
設定は--set-ctrl
」
$ v4l2-ctl -d /dev/video0 --set-ctrl saturation=0
さて、camsetでは設定データを保存できることを紹介しました。具体的には次のようなフォーマットになっています。
brightness=128 contrast=128 saturation=0 white_balance_automatic=1 gain=0 power_line_frequency=2 sharpness=128 backlight_compensation=0 auto_exposure=3 exposure_dynamic_framerate=0 pan_absolute=0 tilt_absolute=0 focus_automatic_continuous=1 zoom_absolute=100 resolution_index=0
これはまさにv4l2-ctl --set-ctrl
」
まずは設定を反映するプログラムを作成します。これは上記を実行するシェルスクリプトとして作れば良いでしょう。たとえば~/.local/
」
#!/bin/sh if [ ! -c /dev/video0 ]; then # UVC is not found exit 0 fi v4l2-ctl -d /dev/video0 --set-ctrl brightness=128 v4l2-ctl -d /dev/video0 --set-ctrl contrast=128 v4l2-ctl -d /dev/video0 --set-ctrl saturation=0 v4l2-ctl -d /dev/video0 --set-ctrl white_balance_automatic=1 v4l2-ctl -d /dev/video0 --set-ctrl gain=0 v4l2-ctl -d /dev/video0 --set-ctrl power_line_frequency=2 v4l2-ctl -d /dev/video0 --set-ctrl sharpness=128 v4l2-ctl -d /dev/video0 --set-ctrl backlight_compensation=0 v4l2-ctl -d /dev/video0 --set-ctrl auto_exposure=3 v4l2-ctl -d /dev/video0 --set-ctrl exposure_dynamic_framerate=0 v4l2-ctl -d /dev/video0 --set-ctrl pan_absolute=0 v4l2-ctl -d /dev/video0 --set-ctrl tilt_absolute=0 v4l2-ctl -d /dev/video0 --set-ctrl focus_automatic_continuous=1 v4l2-ctl -d /dev/video0 --set-ctrl zoom_absolute=100 v4l2-ctl -d /dev/video0 --set-ctrl resolution_index=0
あとはこれに実行権限を付けておきましょう。
$ chmod +x ~/.local/bin/cameraconfig
試しにcamsetか何かで設定を変更した上で、cameraconfig
」
次にログイン時に自動起動するようにします。.bashrc
などに記載しても良いのですが、今回はXDG AUtostartを利用しましょう。これはdesktopファイルを特定のディレクトリに置くことで、それを起動時に自動実行してくれる仕組みです。
たとえば次のようなファイルを~/.config/
」
[Desktop Entry] Type=Application Name=Update camera settings Exec=cameraconfig StartupNotify=false NoDisplay=true Hidden=true
desktopファイルが問題ないかは、次のコマンドで確認できます。
$ desktop-file-validate ~/.config/autostart/cameraconfig.desktop
これで次回ログイン時からは、好みの設定でカメラが起動するようになりました。今回はカメラデバイスが1台という前提で決め打ちしていますが、複数台運用しているのであればudevルールなどでシンボリックな名前を付けると区別がしやすくなります。
V4Lはその名前のとおり、映像に関するデバイスの設定です。今回はWebカメラに限定しましたが、V4Lがサポートするデバイスであれば他にも同様の対応が可能になります。ぜひ手持ちのデバイスが正しく操作できるか試してみてください。