他のアプリケーションが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を使用すると期待どおりに動作しているようで、わかりません。)