0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GoPro HERO8をUSBカメラとして使用するまでの道のり

Posted at

背景

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が選択可
  • 例:STARTコマンド

解像度1080pでUDPビデオストリームを開始する

curl -s 172.24.169.51/gp/gpWebcam/START?res=1080
  • 例:STOPコマンド

UDPビデオストリームを停止する

curl -s 172.24.169.51/gp/gpWebcam/STOP
  • 例:SETTINGSコマンド

レンズモードを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

改善

  • USB接続でデバイスファイルを自動作成する

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?