enchufado
   RSS
#
Cámara virtual en GNU/Linux (GNU/Linux) 2020-05-03 22:04:56

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)


Volver al indice

login, admin, form, register