Establecer la velocidad de fotogramas de salida de un dispositivo v4l2

Establecer la velocidad de fotogramas de salida de un dispositivo v4l2

Estoy usando v4l2loopbackv0.12.5 y wf-recordergrabo mi pantalla en Wayland. Estoy buscando reducir la velocidad de cuadros de la transmisión de video leída por mi navegador. Actualmente no puedo obtener nada más que 60 fps.

He usado la versión wf-recorder 0.2.1yeste tenedorya que agrega la opción de configurar la velocidad de fotogramas. Sin embargo, obtengo el mismo resultado.

Si empiezo wf-recordercon este comando:

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

/sys/devices/virtual/video4linux/video0/formatSe ve como esto:

YU12:2560x1440@30

Sin embargo, el resultado del comando informa que la velocidad de fotogramas es 60, no @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)

Si abro el dispositivo ffplayveo que informa 30 fps:

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

Usandowebcamtests.comRecibo ~60 fps reportados.

Si, en cambio, inicio wf-recorder con el -rindicador configurado en 6:

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

wf-recorderFramerate: 6Sin embargo, los informes /sys/devices/virtual/video4linux/video0/formattodavía lo muestran YU12:2560x1440@30.

Esto me lleva a creer que el problema no está en wf-recorder, o más bien en que no puedo configurar la velocidad de fotogramas con esa herramienta.

En lugar de eso, busqué cambiar la configuración del dispositivo. Correr:

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

Veo que el formato cambia a YU12:2560x1440@6. Sin embargo, no veo ningún cambio en la velocidad de fotogramas percibida.

Si corro:

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

Veo que el formato cambia a: YU12:2560x1440@6000/1000pero nuevamente no veo ningún cambio en la velocidad de fotogramas percibida (aún 60 fps en mi navegador).

No parece haber ninguna opción para configurar para esto en el v4l2loopbackmódulo del kernel.

Me estoy quedando sin ideas: ¿hay algo más que pueda probar o mi pobre computadora está condenada a procesar transmisiones de video de 100 Mbit para siempre? :D

Respuesta1

Al final pude hacer esto con otro dispositivo v4l y este comando gstreamer:

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

Respuesta2

Pude limitar los fotogramas por segundo a 10 configurándolo en el dispositivo v4l2loopback de esta manera antes del inicio wf-recorder.

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

Reproducir la transmisión ffplay /dev/video6después de hacer esto confirmó la configuración:

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

El resultado de ayuda de v4l2-ctltiene lo siguiente sobre esta configuración:

$ 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]
...

información relacionada