momoを使ったアプリのテストをするときに、常に動きのある映像が流れている状態にしたい。
映像が止まったらハングアップしているとすぐにわかるので。
そのために実際のカメラの映像でなくて決まったテストパターンを繰り返し配信できると嬉しい。
momoのソースコードを修正せずにそれが実現できた。
v4l2 loopback
この記事でテスト音声を流したときにはALSAのloopbackデバイスを使用した。
ALSAのloopbackがあるなら、v4l2にも同様なものがないか探したらドンピシャのものが見つかった。
具体的な使い方
https://github.com/umlaeute/v4l2loopback/wiki
インストール
sudo apt install v4l2loopback-dkms
これで現在のカーネルのバージョンに合わせたv4l2loopback.ko をビルドしてインストールしてくれる。
テスト
webcamや専用カメラモジュールをつけない状態でラズパイを起動する。
sudo modprobe v4l2loopback
これで /dev/video0 ができる。
テストパターンを流す。
ffmpeg -re -f lavfi -i testsrc=size=640x480:rate=10 -pix_fmt yuv420p -f v4l2 /dev/video0
これでmomoを実行するとテストパターンを/dev/video0 から読み取って配信することができる。
しかしこれは負荷が高くてラズパイ2ではVGAの解像度でフレームレートを10fpsまで下げる必要があった。
あらかじめデコードした動画ファイルを作っておいてそれを流す
10秒間のテストデータを作る。
ffmpeg -f lavfi -i testsrc=duration=10:size=640x480:rate=30 -pix_fmt yuv420p -f rawvideo testsrc.yuv420p
これを /dev/video0 に流し込む。
ffmpeg -stream_loop -1 -re -f rawvideo -pix_fmt yuv420p -s 640x480 -r 30 -i testsrc.yuv420p -c copy -f v4l2 /dev/video0
-stream_loop -1
をつけると無限に繰り返す。
これでmomoを起動するとラズパイ2でもVGAの解像度で30fpsで配信することができた。
momoでのビデオデバイスの選択
タイミングよくリリースされた momo 19.08.1 で --video-device
オプションが追加された。
これでビデオデバイスが複数あるときでも明示的にビデオデバイスを指定できるようになった。
なのでv4l2loopback を使用するときにわざわざカメラを外さなくてもよくなった。