v4l2loopbackで遊ぶ


Linux

v4l2loopbackを使うことで仮想カメラデバイスを作ってそこに映像とかをffmpegとかで流し込んだりすることでそのデバイスを使って映像を取得できたりできるみたいなのでちょっと使って遊んでみた

セットアップ

sudo modprobe v4l2loopback exclusive_caps=1

これで/dev/video[n]みたいなデバイスが作られるのでそこに映像を流し込んでいく

ffmpegを使って特定のウィンドウをキャプチャして流し込む

INFO=$(xwininfo)
W=$(echo "$INFO" | grep -oP 'Width: \K\d+')
H=$(echo "$INFO" | grep -oP 'Height: \K\d+')
X=$(echo "$INFO" | grep "Absolute upper-left X" | awk '{print $4}')
Y=$(echo "$INFO" | grep "Absolute upper-left Y" | awk '{print $4}')

W=$(( W / 2 * 2 ))
H=$(( H / 2 * 2 ))

ffmpeg -f x11grab -video_size "${W}x${H}" -i :0.0+${X},${Y} -vcodec rawvideo -f v4l2 -pix_fmt yuv420p /dev/video2

自分の場合は/dev/video2になったのでそこにウィンドウをキャプチャしたのを流しこんでいく

テスト

ffplay /dev/video2

これでウィンドウをキャプチャしてる画面が表示されればおk

OBSでv4l2デバイスを取り込む

ソースから映像キャプチャデバイス(V4L2)を選択してデバイスでv4l2loopbackで作ったデバイスを指定すればそこに流し込んでる映像がOBSのプレビューに表示されるはず

OBSにはウィンドウをキャプチャして配信するような機能がそもそもあるので別にこれ使わなくてもできる

終わり。で結局これ何に使えるのかってGeminiに聞いたところ

image

みたいな感じらしい

余談1: IP WebCamアプリを使ってスマホの画面をv4l2loopbackに流し込む

IP WebCamアプリを入れてから配信をスタート(特に別サービスと連携とか必要無し)させた状態で

ffmpeg -i http://スマホのIP:8080/video -vf "format=yuv420p" -f v4l2 /dev/video2

とかをやるとスマホで配信してる画面をv4l2デバイスに流し込めてそれを見ることができるようになる

普通にhttp://IP:8080/videoで見れるけどねw

余談2: scrcpyを使ってスマホの画面を流し込む

scrcpy --v4l2-sink=/dev/video2 -N

あとはffplay /dev/video2とかで見れる。見れるだけで操作とかはできないけどw