Установить выходную частоту кадров устройства v4l2

Установить выходную частоту кадров устройства v4l2

Я использую v4l2loopbackv0.12.5 и wf-recorderзаписываю свой экран на wayland. Я хочу уменьшить частоту кадров видеопотока, считываемого моим браузером. В настоящее время я не могу получить ничего, кроме 60 кадров в секунду.

Я использовал версию 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

Однако вывод команды сообщает, что частота кадров составляет 60, а не 30:

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)

Если я открою устройство, то ffplayувижу, что оно сообщает о 30 кадрах в секунду:

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

С использованиемwebcamtests.comЯ получаю сообщение о ~60 кадрах в секунду.

Если вместо этого я запущу wf-recorder с флагом, -rустановленным на 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 кадров в секунду).

Похоже, что в модуле ядра нет никаких опций для настройки этого параметра v4l2loopback.

У меня заканчиваются идеи — что еще попробовать или мой бедный компьютер обречен вечно обрабатывать 100-мегабитные видеопотоки? :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

Мне удалось ограничить количество кадров в секунду до 10, установив его на устройстве v4l2loopback перед запуском 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]
...

Связанный контент