如何动态更改 v4l2loopback 设备的分辨率/功能?

如何动态更改 v4l2loopback 设备的分辨率/功能?

我正在尝试从一种广告分辨率/帧速率切换到另一种,最好是在其他应用程序正在使用 v4l2loopback 源时切换。例如,我将 1920x1080 黑屏视频输入到 中/dev/video2,然后在 中打开它vlc。这工作正常:

$ ffmpeg -f lavfi -i color=c=black:s=1920x1080:r=25/1 -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video2
$ ffmpeg -f v4l2 -list_formats all -i /dev/video2
ffmpeg version n4.3.1 Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10.1.0 (GCC)
  configuration: --prefix=/usr --disable-debug --disable-static --disable-stripping --enable-avisynth --enable-fontconfig --enable-gmp --enable-gnutls --enable-gpl --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libdav1d --enable-libdrm --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libiec61883 --enable-libjack --enable-libmfx --enable-libmodplug --enable-libmp3lame --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librav1e --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxcb --enable-libxml2 --enable-libxvid --enable-nvdec --enable-nvenc --enable-omx --enable-shared --enable-version3
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
[video4linux2,v4l2 @ 0x55864f9b06c0] Raw       :     yuv420p :     Planar YUV 4:2:0 : 1920x1080
/dev/video2: Immediate exit requested

然而,终止旧的提要然后将不同的分辨率流式传输到设备中不会改变所宣传的功能,而只会扰乱 vlc 中的屏幕。

$ ffmpeg -f lavfi -i color=c=black:s=1280x800:r=25/1 -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video2

# The list_formats options are still the same (only 1920x1080)
# vlc shows a green instead of a black screen

是否可以即时更改此设置?

答案1

只要设备打开,它的分辨率(和格式)就是固定的。

所以你的问题的答案是:不,你不能即时更改这些设置。

(除非你在开始新的之前退出所有消费者(在你的情况下:VLC)ffmpeg;但这不是我所说的“即时”)

这是 V4L2 API 的限制,您无法向任何附加应用程序发出分辨率/格式更改信号。

似乎也存在一个问题ffmpeg,应该是

  • 如果无法更改,请调整输出帧大小
  • 或拒绝跑步

(这也可能是模块中的一个错误v4l2loopback(没有正确报告帧大小没有改变),但是使用 GStreamer 它似乎按预期工作,所以我不确定)

相关内容