Encontrei a seguinte pergunta e tentei enviar um vídeo mp4 para minha câmera: Existe alguma maneira do ffmpeg enviar vídeo para /dev/video0 no Ubuntu?
Usei o seguinte comando:
ffmpeg -re -i fakezoom.mp4 -map 0:v -f h264 /dev/video0
De acordo com o Ubuntu, as propriedades do arquivo mp4 são H.264, 30 quadros por segundo, taxa de bits de 414kbps.
Quando executo o comando, obtenho a seguinte saída:
ffmpeg -re -i fakezoom.mp4 -map 0:v -f h264 /dev/video0
ffmpeg version 4.2.4-1ubuntu0.1 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-10ubuntu2)
configuration: --prefix=/usr --extra-version=1ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
WARNING: library configuration mismatch
avcodec configuration: --prefix=/usr --extra-version=1ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libaribb24 --enable-liblensfun --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x56370afc9700] st: 0 edit list: 1 Missing key frame while searching for timestamp: 0
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x56370afc9700] st: 0 edit list 1 Cannot find an index entry before timestamp: 0.
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'fakezoom.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: mp41avc1
creation_time : 2021-04-20T09:39:14.000000Z
encoder : vlc 3.0.9.2 stream output
encoder-eng : vlc 3.0.9.2 stream output
Duration: 00:13:18.78, start: 0.000000, bitrate: 416 kb/s
Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, unknown/bt709/bt709), 1280x720 [SAR 1:1 DAR 16:9], 414 kb/s, 17.91 fps, 17.67 tbr, 90k tbn, 60 tbc (default)
Metadata:
creation_time : 2021-04-20T09:39:14.000000Z
handler_name : VideoHandler
File '/dev/video0' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[libx264 @ 0x56370afce880] using SAR=1/1B time=-577014:32:22.77 bitrate= -0.0kbits/s speed=N/A
[libx264 @ 0x56370afce880] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0x56370afce880] profile High, level 3.1
Output #0, h264, to '/dev/video0':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: mp41avc1
encoder : Lavf58.29.100
Stream #0:0(eng): Video: h264 (libx264), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 17.67 fps, 17.67 tbn, 17.67 tbc (default)
Metadata:
creation_time : 2021-04-20T09:39:14.000000Z
handler_name : VideoHandler
encoder : Lavc58.54.100 libx264
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
av_interleaved_write_frame(): Invalid argumente=00:00:02.88 bitrate= 665.2kbits/s dup=0 drop=1 speed=0.408x
Error writing trailer of /dev/video0: Invalid argument
frame= 121 fps= 16 q=27.0 Lsize= 258kB time=00:00:03.22 bitrate= 654.2kbits/s dup=0 drop=1 speed=0.432x
video:258kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
[libx264 @ 0x56370afce880] frame I:1 Avg QP:17.14 size: 45994
[libx264 @ 0x56370afce880] frame P:31 Avg QP:20.92 size: 9074
[libx264 @ 0x56370afce880] frame B:89 Avg QP:22.87 size: 853
[libx264 @ 0x56370afce880] consecutive B-frames: 0.8% 3.3% 0.0% 95.9%
[libx264 @ 0x56370afce880] mb I I16..4: 7.1% 77.3% 15.7%
[libx264 @ 0x56370afce880] mb P I16..4: 0.2% 2.1% 0.5% P16..4: 18.5% 7.1% 3.1% 0.0% 0.0% skip:68.4%
[libx264 @ 0x56370afce880] mb B I16..4: 0.0% 0.0% 0.0% B16..8: 10.1% 0.4% 0.1% direct: 0.3% skip:89.1% L0:48.1% L1:48.4% BI: 3.6%
[libx264 @ 0x56370afce880] 8x8 transform intra:76.2% inter:67.0%
[libx264 @ 0x56370afce880] coded y,uvDC,uvAC intra: 57.3% 80.2% 42.2% inter: 3.4% 5.5% 0.1%
[libx264 @ 0x56370afce880] i16 v,h,dc,p: 20% 15% 10% 55%
[libx264 @ 0x56370afce880] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 28% 13% 12% 7% 9% 11% 7% 7% 6%
[libx264 @ 0x56370afce880] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 18% 10% 6% 11% 11% 9% 6% 6%
[libx264 @ 0x56370afce880] i8c dc,h,v,p: 46% 20% 21% 13%
[libx264 @ 0x56370afce880] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0x56370afce880] ref P L0: 56.5% 16.3% 20.0% 7.2%
[libx264 @ 0x56370afce880] ref B L0: 75.3% 20.1% 4.6%
[libx264 @ 0x56370afce880] ref B L1: 98.8% 1.2%
[libx264 @ 0x56370afce880] kb/s:470.92
Conversion failed!
Termina com uma conversa falhada, mas também inclui outras mensagens estranhas, como
av_interleaved_write_frame(): Invalid argumente=00:00:02.88 bitrate= 665.2kbits/s dup=0 drop=1 speed=0.408x
Error writing trailer of /dev/video0: Invalid argument
Há algo que estou fazendo de errado?
v4l2-ctl --list-devices
saídas:
OBS Video Source (platform:v4l2loopback-000):
/dev/video10
UVC Camera (046d:081b) (usb-0000:02:00.0-5):
/dev/video0
/dev/video1
Pode ser por causa do loopback que estou usando lá? Às vezes, uso um programa que mapeia /dev/video0 para video10 para simular uma tela verde e adicionar um fundo virtual quando quero usar minha câmera da maneira correta.
Alguém sabe como resolver isso?
Responder1
A resposta que você vinculou mostra como fazer uma "câmera falsa". Assim, o vídeo de sua escolha pode ser direcionado para um /dev/video*
dispositivo que ainda não esteja sendo usado por um dispositivo real.
Não deve haver necessidade de alimentar um vídeo em um dispositivo existente. Esses dispositivos produzem apenas vídeo, então duvido que você possa alimentar um vídeo arbitrário para uma câmera de qualquer maneira.
Ao executá-lo, sudo modprobe v4l2loopback
ele deverá criar um novo /dev/video
usando um número de ID que não esteja em uso no momento (como /dev/video2
). Então corra:
ffmpeg -re -i fakezoom.mp4 -map 0:v -f v4l2 /dev/video2
Observe a mudança de -f h264
as na sua pergunta para -f v4l2
.