背景
GoProをUSBカメラとして使用するための環境構築で、USBをさして自動起動するようにudevルールを使おうとした際に、udevルールのデバックをするために使用したツールを書き留める
やりたい事
-
GOPRO HERO8
をUSBでPCと接続するPC上では仮想のネットワークインターフェースとして認識されIPアドレスが振られる
機種によるがPC: 172.24.169.54, GOPRO: 172.24.169.51となる
-
GOPRO HERO8
からUDPビデオストリームを配信するGOPROにAPIを通じて配信開始とレンズモードを設定する
APIの情報はここから入手(https://github.com/jschmid1/gopro_as_webcam_on_linux)
-
仮想ビデオデバイスを作成する
UDPビデオストリームを書込先のビデオデバイスファイル
/dev/video42
を作成する
-
UDPビデオストリームをffmpegで受信、デバイスファイルへ書き込み
ffmpeg
コマンドでUDPビデオストリームを入力データとして受信し、
デバイスファイルに特定のピクセルフォーマットに書き込む
詳細
GOPRO_APIについて
下記のフォーマットでcurl
コマンドを使用してGOPRO
へコマンドを送信する
# フォーマット
curl -s <GOPRO IP>/gp/gpWebcam/<COMMAND>?<PARAMS>
COMMAND:
- START :UDPビデオストリーム配信の開始
PARAMS:
- res=[1080,720,480]
カメラの解像度を設定するパラメータ
選択できる解像度は1080p, 720p, 480pが選択可
- STOP :UDPビデオストリーム配信の停止
- SETTINGS:パラメータの設定
PARAMS:
- fov=[0, 3, 4, 6]
レンスモードを選択するパラメタ
SuperWide, Wide, Linear, Narrowが選択可
解像度1080pでUDPビデオストリームを開始する
curl -s 172.24.169.51/gp/gpWebcam/START?res=1080
UDPビデオストリームを停止する
curl -s 172.24.169.51/gp/gpWebcam/STOP
レンズモードをLinear
に設定する
curl -s 172.24.169.51/gp/gpWebcam/SETTINGS?fov=4
仮想ビデオデバイスの作成方法
sudo modprobe v4l2loopback \
exclusive_caps=1 \ # 仮想ビデオデバイスのケーパビリティ
card_label='GoPro' \ # 仮想ビデオデバイスのラベル
video_nr=42 # ビデオデバイス番号
sudo modprobe -rf v4l2loopback
ffmpeg
ビデオストリームバインド
ffmpeg -nostdin -threads 1 \
-i 'udp://@0.0.0.0:8554?overrun_nonfatal=1&fifo_size=5000000'\
-f:v mpegts -fflags nobuffer -flags low_delay -vf setpts=0 \
-vf format="yuv420p" -f v4l2 /dev/video42
改善
udevルールを使用してGOPROカメラをUSBに接続した時、自動で仮想デバイスファイルを作成するようにする
#/etc/udev/rules.d/60-gopro.rules
SUBSYSTEM=="net", ATTRS{idVendor}=="2672", ATTRS{product}=="HERO8 BLACK", ACTION=="add", RUN+="/usr/sbin/modprobe v4l2loopback exclusive_caps=1 card_label='GoPro' video_nr=42">
SUBSYSTEM=="net", ATTRS{idVendor}=="2672", ATTRS{product}=="HERO8 BLACK", ACTION=="remove", RUN+="/usr/sbin/modprobe -rf v4l2loopback">
これを作成する際にudevルールファイルがどう動作しているかデバックする方法がわからなかったのメモ
- 書き換えたudevルールファイルの有効化
sudo udevadm control --reload
sudo udevadm trigger
- udev挙動のモニタ
# kernel, udev イベントを表示
udevadm monitor
# イベントプロパティを表示
udevadm monitor --property