💡

ラズパイと USB カメラで作る宅内ライブカメラ - WebRTC Native Client Momo を使用する際の留意点と対策について

2023/02/13に公開

ラズパイと安価な USB Web カメラを組み合わせ、ブラウザで閲覧できる宅内ライブカメラ(音声あり)をセットアップする過程で得た知見について、特に WebRTC Native Client Momo(以下、momo)をセットアップする際につまづくかもしれない問題と対策について共有したいと思います。

前提とする環境とセットアップまで

使用した機材の詳細は次の通りです。

  • Raspberry Pi 3 Model B+
  • ロジクール C270n HD ウェブカメラ

OS は Raspberry Pi OS(32-bit)です。Raspberry Pi Imager v1.7.3 で SD カードにイメージを書き込んで起動した後、全てのパッケージを apt で最新にアップデートした状態から momo のセットアップを行いました。

ラズパイでのセットアップ手順は Github のページで示されている通りですが、手順というほどの手間はほどんどなく必要なパッケージを 2 つほど apt でインストールした後、リリースアセットからバイナリをダウンロードして起動するだけになります。

Raspberry Pi (Raspberry-Pi-OS) で Momo を使ってみる
https://github.com/shiguredo/momo/blob/develop/doc/SETUP_RASPBERRY_PI.md

セットアップ後に起こりうる問題と対策

キャプチャ対象とするビデオデバイスは起動パラメータで指定することができますのでもし USB カメラのデバイス ID が/dev/video0でない場合は起動パラメータで USB カメラのデバイス ID を指定するように対応すればよいものと思います。(なお当方の環境では USB カメラが/dev/video0以外に割り当てられたことはなく、この起動パラメータも使用したことはありません。)

一方でサウンドデバイスについては起動パラメータでキャプチャ対象を指定することができません。momo は ALSA の default に設定されているデバイスからのキャプチャのみに対応しているようで、USB カメラのデバイスが 0 以外のカード番号で認識されているとマイクの音声をキャプチャできない状態が起こります。(当方の環境では何も設定をしないとカード 1 かカード 2 のいずれかに割り当てられることを確認しています。)

なお PulseAudio が起動している環境下の場合は、PulseAudio が default になり有効な入力デバイスを自動的に選択してくれるので何も対応しなくても音声のキャプチャは正常に行われます。PulseAudio はユーザーユニットで起動するサービスのため CLI のターミナルや GUI でのログイン、あるいは SSH でリモート接続した環境から momo を起動している場合は PulseAudio の動作によって音声キャプチャの問題は起こりません。セットアップ直後の動作確認ではおおよそこの状態になるはずなので、その時点では音声がキャプチャされないという問題は起こらないと思います。

問題は momo を Systemd のシステムユニットで自動起動するように設定している場合になります。Systemd のシステムユニットで起動される環境(root 環境)においては PulseAudio が起動しないため、USB カメラのデバイスが default として選択されずマイクの音声がキャプチャされない問題が起こります。momo を Systemd のシステムユニットで自動起動するように設定したい場合は、次のいずれかの方法をとることでこの問題を回避できます。(対策 1 と対策 2 は USB カメラのデバイスがカード番号 1 で認識されている前提です。)

対策 1. 環境変数でカード番号を設定してから momo を起動する

環境変数 ALSA_CARD で defatult のサウンドカードを切り替えることができるので、この変数に USB カメラのカード番号を設定してから momo を起動するようにします。

ALSA_CARD=1 ./momo test

対策 2. USB カメラに割り当てられているカード番号を ALSA の default に設定する

ALSA は起動時にいくつかの場所にある設定ファイルを順番に読み込むので、それらのうちのどれか(例えば/etc/asound.conf)で次のように USB カメラのカード番号を設定するようにします。

defaults.pcm.card 1

# もしくは(どちらか一方の記述でよい)

pcm.!default {
    type hw
    card 1
}

対策 3. USB カメラに対して割り当てられるカード番号を 0 に固定する

cat /proc/asound/cardscat /proc/asound/modulesで現在認識されているデバイスとモジュール名を確認します。続いて/etc/modprobe.d/の下に .conf の拡張子をもつ任意の名前のファイル(例えばalsa-base.conf)を作成し、次のような内容の設定を記述します。なお、2 行目以降の index でカード番号を決定しますが 1 行目の slots に記述するモジュール名のほうも index と順番が揃うように列挙する点に注意してください。

options snd slots=snd_usb_audio,snd_bcm2835,vc4
options snd_usb_audio index=0
options snd_bcm2835 index=1
options vc4 index=2

なお、当方の環境ではラズパイの再起動の際にランダムで snd_usb_audio(USB カメラ)と vc4(VideoCoreⅣ)のカード番号が入れ替わることがありました。機材や OS が同じ前提なら同じ状況になるはずですので対策 3 の方法だけでに default に設定するか、もしくは対策 1 や対策 2 の方法でカード番号を指定する場合には、加えてこの設定によって対象の USB カメラに割り当てられるカード番号を固定化しておく必要があるかと思います。

本記事で共有したい内容は以上となります。

Discussion