En éstos tiempos de confinamiento por causa del COVID-19, se ha disparado el número de videoconferencias en remoto y las aplicaciones que lo permiten: Hangouts, Whatsapp y Skype en lo personal, y Zoom, Teams en lo empresarial, por mencionar unas cuantas. Algunas de éstas aplicaciones tienen algunos efectos divertidos incorporados, como difuminar el fondo, o añadir uno divertido o imaginario. Se pueden hacer otras cosas, como realizar el stream de un video que dispongamos nosotros para p.ej. gastar una broma a los compañeros. Ésto se puede hacer en GNU/Linux y lo vamos a conseguir con v4l2loopback, un paquete que consiste en un modulo de kernel que creará una webcam virtual. Video Primero procederemos con la parte de video. Listaremos primero los dispositivos de video por si tenemos alguna otra webcam en el equipo (podria ser alguna incorporada o externa que ya tengamos conectada): $ ls -lh /dev/video* crw-rw----+ 1 root video 81, 0 may 3 19:15 /dev/video0 crw-rw----+ 1 root video 81, 1 may 3 19:15 /dev/video1 Hecho ésto, instalamos los paquetes correspondientes a v4l2loopback, que compilarán el módulo de carga dinámica para nuestra versión de kernel y lo cargaremos. Si volvemos a listar los devices, deberia salir uno nuevo adicional: $ apt-get install v4l2loopback-dkms v4l2loopback-utils $ modprobe v4l2loopback $ ls -lh /dev/video* crw-rw----+ 1 root video 81, 0 may 3 19:15 /dev/video0 crw-rw----+ 1 root video 81, 1 may 3 19:15 /dev/video1 crw-rw----+ 1 root video 81, 2 may 3 21:38 /dev/video2 Como podemos ver, el dispositivo de loopback de video creado es /dev/video2. Podemos probar a reproducir ya el video por el dispositivo con ffmpeg escogiendo (con -map) el primer stream de video disponible: $ ffmpeg -re -i poltergeist.mp4 -map 0:v -f v4l2 /dev/video2 Para comprobar que funciona, podemos abrir VLC, ir a Medio -> Abrir dispositivo de captura y seleccionar el dispositivo de video correspondiente al dispositivo de loopback de video creado (/dev/video2 en nuestro caso). Audio De un modo similar a cuando hemos listado los dispositivos de video, haremos lo propio con los de audio para luego identificar cual es el que añadimos: $ cat /proc/asound/cards 0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xf1520000 irq 34 Cargamos el módulo correspondiente al audio y listamos de nuevo los dispositivos para identificar el nuevo: $ modprobe snd-aloop $ cat /proc/asound/cards 0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xf1520000 irq 34 1 [Loopback ]: Loopback - Loopback Loopback 1 # También lo podemos hacer con el comando: aplay -l Ahora que ya tenemos ambos dispositivos, video y audio, obtenemos la información de los streams (tanto de video como de audio) del archivo de video que queremos reproducir via la webcam virtual, ya que podria ser que un video tuviera más de un stream de audio (p.ej. un video con diversos idiomas), y tenemos que seleccionar el deseado. Nos vamos a fijar en el string "Stream": $ ffprobe poltergeist.mp4 ffprobe version 4.2.2-1+b1 Copyright (c) 2007-2019 the FFmpeg developers built with gcc 9 (Debian 9.2.1-28) configuration: --prefix=/usr --extra-version=1+b1 --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-chromaprint --enable-frei0r --enable-libx264 --enable-shared 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 Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'poltergeist.mp4': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2018-09-30T09:49:41.000000Z Duration: 00:05:11.96, start: 0.000000, bitrate: 318 kb/s Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 188 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc (default) Metadata: creation_time : 2018-09-30T09:49:41.000000Z handler_name : ISO Media file produced by Google Inc. Created on: 09/30/2018. Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default) Metadata: creation_time : 2018-09-30T09:49:41.000000Z handler_name : ISO Media file produced by Google Inc. Created on: 09/30/2018. En éste caso sólo hay 1 stream por medio: 1 de video y 1 de audio. Con éstos datos, podemos reproducir el video y el audio a través de la webcam virtual del siguiente modo: $ ffmpeg -re -i poltergeist.mp4 -map 0:0 -f v4l2 /dev/video2 -map 0:1 -f alsa hw:1,1 Si queremos validarlo con VLC, volvemos a ir a Medio -> Abrir dispositivo de captura y seleccionar el dispositivo de video correspondiente al dispositivo de loopback de video creado (/dev/video2), y por lo que respecta al dispositivo de audio, seria en el formato "hw:1,1": Con ésto funcionando, en aquellas aplicaciones en las que se pueda elegir el dispositivo de la supuesta webcam, podremos elegir la webcam de loopback, poner a reproducir el video que queramos y ver las caras de la gente :) Para terminar, comentar que podemos ver la configuración del dispositivo de video y cambiarlo del siguiente modo (en el ejemplo, establecer el rate de fps a 25): $ v4l2-ctl --all -d 2 $ v4l2loopback-ctl set-fps 25 /dev/video2 Éste post no hubiera sido posible de no ser por éste y éste otro artículo. Desde aquí mandamos agradecimientos a sus autores. Comentarios (0) |