Ffmpeg
如何動態更改 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
是否可以即時更改此設置?
只要打開設備,它的解析度(和格式)都是固定的。
所以您的問題的答案是:不,您不能即時更改這些設置。
(除非您在開始新的之前退出所有消費者(在您的情況下:VLC)
ffmpeg
;但這不是我所說的“即時”)這是 V4L2 API 的一個限制,您無法向任何附加的應用程序發出解析度/格式更改信號。
似乎也有問題
ffmpeg
,應該要麼
- 如果無法更改,請調整輸出幀大小
- 或拒絕跑步
(它也可能是
v4l2loopback
模組中的一個錯誤(沒有正確報告幀大小沒有改變),但是使用 GStreamer 它似乎可以按預期工作,所以我不確定)