ラズパイ+momoでWebRTCで送信するときにwebcamをつなぐとマイクとしてwebcamの内蔵マイクが使用できる。しかし専用カメラモジュールを使用したときはマイクがない。
音声なしの配信ではさびしいので、あらかじめ用意した音声ファイルの内容を送信できるようにした。
概要
ALSAのloopbackデバイスを使用するとオーディオキャプチャデバイスに任意の内容を流し込むことができる。
これを使ってmomoにあらかじめ用意した音声ファイルを読み込ませる。
使用したmomoのversionは以下の通り。
./momo --version
WebRTC Native Client Momo version 19.08.0 USE_MMAL_ENCODER=1
音声ファイルの準備
momoでは音声のエンコード、デコードはソフトウェアで行う。ラズパイのように非力なCPUにとっては負荷が大きい処理である。
そこで使用する音声ファイルはあらかじめデコードしてwavファイルにしておく。
形式はサンプリングレート 48kHz ステレオ。
ffmpeg -i input.mp3 -ar 48000 -ac 2 output.wav
ALSA loopback デバイス
今回は音声ファイルを流し込むのにALSAのloopback デバイスを使用する。
カーネルモジュールのロード
sudo modprobe snd-aloop
起動時に自動的にロードするには /etc/modules
に追記しておく。
sudo sh -c "echo snd_aloop >> /etc/modules"
Loopback ができていることの確認、
$ arecord -L |grep Loopback
...
hw:CARD=Loopback,DEV=0
Loopback, Loopback PCM
hw:CARD=Loopback,DEV=1
Loopback, Loopback PCM
plughw:CARD=Loopback,DEV=0
Loopback, Loopback PCM
plughw:CARD=Loopback,DEV=1
Loopback, Loopback PCM
ALSA のコンフィグファイル
前回の記事 の通りmomoはオーディオキャプチャデバイスとして default
を使用する。
なので、loopback の受け側を default
として参照できるようにALSAのコンフィグファイルを用意する。
pcm.!default {
type plug
slave.pcm "hw:Loopback,0,0"
}
音声ファイルを流し込む
-vv
オプションをつけるとVUメータが表示される。
aplay -D hw:Loopback,1 -vv sample.wav
defaultのオーディオキャプチャデバイスに音がきていることの確認
上記のコマンドを実行したままで、別のターミナルを開いて
arecord -D default -vv -f dat > /dev/null
これでVUメータが振れていればOK。^C で止める。
複数のwavファイルを順番に流す場合のスクリプト
#!/bin/sh
TEST_SOUND_DIR=~/wav/
while :; do
for i in $TEST_SOUND_DIR/*.wav; do
aplay -D hw:Loopback,1 "$i"
done
done
momoの実行
これで通常通りmomoを実行すれば、流し込んだ音声ファイルの配信ができる。
しかし聞いてみるとモノラルになってしまっている。(ステレオの左チャネルの音しか聞こえない。)
ログを調べてみると、どうも人の話し声を想定したエコーキャンセリングやオートゲインコントロールがデフォルトで有効になってしまっているようだ。
音楽を流す時にはこれらの機能をオフにしたいが、現状のmomoにその機能はまだ無い。
今はとりあえずここまで。
続きを書きました。
ラズパイのmomoでステレオ音声でWebRTCで配信する