v4l2デバイスの出力フレームレートを設定する

v4l2デバイスの出力フレームレートを設定する

v4l2loopback私はv0.12.5を使用しており、 wf-recorderWayland で画面を録画しています。ブラウザで読み取るビデオ ストリームのフレーム レートを下げたいと考えています。現在、60fps 以外を取得できません。

私はwf-recorderのバージョンを使用しており0.2.1このフォークフレームレートを設定するオプションが追加されます。ただし、出力は同じになります。

wf-recorderこのコマンドで開始する場合:

wf-recorder \
        -x yuv420p \
        -g "$x,$y ${width}x$height" \
        --muxer=v4l2 \
        --codec=rawvideo \
        --file="$device"

/sys/devices/virtual/video4linux/video0/format次のようになります:

YU12:2560x1440@30

ただし、コマンド出力ではフレームレートが 30 ではなく 60 であると報告されています。

selected region 0 0 2560 1440
Framerate: 60
Choosing pixel format yuv420p
Output #0, video4linux2,v4l2, to '/dev/video0':
    Stream #0:0: Unknown: none (rawvideo)

デバイスを開くと、ffplay30fps と報告されていることがわかります。

Input #0, video4linux2,v4l2, from '/dev/video0':B sq=    0B f=0/0
  Duration: N/A, start: 1102.869115, bitrate: 1327104 kb/s
    Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 2560x1440, 1327104 kb/s, 30 fps

使用ウェブカメラテスト約 60fps が報告されます。

-r代わりにフラグを次のように設定してwf-recorder を起動すると6

wf-recorder \
        -x yuv420p \
        -r 6 \
        -g "$x,$y ${width}x$height" \
        --muxer=v4l2 \
        --codec=rawvideo \
        --file="$device"

wf-recorderFramerate: 6ただし、レポートには/sys/devices/virtual/video4linux/video0/format依然として表示されますYU12:2560x1440@30

このことから、問題は ではなくwf-recorder、むしろそのツールではフレームレートを設定できないのではないかと考えられます。

代わりに、デバイスの設定を変更することにしました。実行中:

echo "@6"| sudo tee /sys/devices/virtual/video4linux/video0/format

フォーマットが に変更されたことがわかりますYU12:2560x1440@6。ただし、認識されるフレームレートには変化が見られません。

実行した場合:

sudo v4l2-ctl -d /dev/video0 -p 6

フォーマットが次のように変更されているのがわかりますYU12:2560x1440@6000/1000が、ここでも認識されるフレームレートには変化がありません (ブラウザでは依然として 60 fps です)。

カーネル モジュールでこれを設定するオプションはないようですv4l2loopback

アイデアが尽きてきました。他に試すものはありますか、それとも私の貧弱なコンピューターは永遠に 100Mbit のビデオ ストリームを処理する運命にあるのでしょうか? :D

答え1

最終的に、別の v4l デバイスと次の gstreamer コマンドを使用してこれを行うことができました。

gst-launch-1.0 -v v4l2src device=/dev/video0 ! videorate drop-only=true ! video/x-raw,framerate=6/1 ! v4l2sink device=/dev/video1

答え2

起動前に v4l2loopback デバイスで次のように設定することで、1 秒あたりのフレーム数を 10 に制限できましたwf-recorder

v4l2-ctl -d /dev/video6 --set-parm 10

これを行った後にストリームを再生するffplay /dev/video6と、設定が確認されました。

Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 2560x1410, 433152 kb/s, 10 fps, 10 tbr, 1000k tbn, 1000k tbc

のヘルプ出力には、v4l2-ctlこの設定に関する次の内容が記載されています。

$ v4l2-ctl --help-all
...
  -P, --get-parm     display video parameters [VIDIOC_G_PARM]
  -p, --set-parm <fps>
                     set video framerate in <fps> [VIDIOC_S_PARM]
...

関連情報