Closed3

物理カメラ(90 fps)の内容をそのまま v4l2loopback で作った仮想カメラに移したい

しろがみしろがみ

やりたいこと

90 fps のグローバルシャッターカメラを購入した、これで弾道測定をやりたいが 30fps による画像処理と 90 fps による動画撮影を両立したくなってきた。

物理カメラを直接プログラムから使うと1つのプロセスしか使用ができない。
GStreamer で tee + queue で2つの処理を並行させることもできるが、それぞれ分けたほうがやりやすいので仮想デバイスを立てて複数使用ができないかを調べる。

カメラが MJPEG, 1920 x 1080, 90 fps なためこれをそのまま仮想デバイスに出力したい。最悪 MJPEG じゃなくても妥協できるが画質、fps は妥協できない

しろがみしろがみ

✅ v4l2loopback で 90 fps を指定する

どうも v4l2loopback で作られたカメラはデフォルトで 30fps になるぽい、明示的に 90 fps を指定する

# カメラ作成
sudo modprobe v4l2loopback video_nr=2
v4l2loopback-ctl set-fps 90 /dev/video2

# ffmpeg で video2 に流す
ffmpeg -input_format mjpeg -framerate 90 -f v4l2 -i /dev/video0 -f v4l2 -vcodec copy /dev/video2

# /dev/video2 を output.mp4 に流す
ffmpeg -f v4l2 -input_format mjpeg -framerate 90 -video_size 1920x1080 -i /dev/video2 -c copy output.mp4 -y

思ったよりかんたんにできてしまった

86.91 fps 出てるなら十分

$ ffprobe output.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2mp41
    encoder         : Lavf59.27.100
  Duration: 00:00:06.64, start: 0.000000, bitrate: 157777 kb/s
  Stream #0:0[0x1](und): Video: mjpeg (Baseline) (mp4v / 0x7634706D), yuvj422p(pc, bt470bg/unknown/unknown), 1920x1080, 157767 kb/s, 86.91 fps, 1000k tbr, 1000k tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
このスクラップは2025/02/05にクローズされました