En esta parte 2 vamos a ver como usar la cámara de nuestro Android como webcam.
Para ello necesitaremos de:
- Un teléfono con Android (obvio).
- La aplicación de IP Webcam.
- Lo ya contado en el artículo anterior.
Una vez contemos con esto, abrimos la aplicación en el móvil y la configuramos al gusto.
Nota: Tengo que avisar que aunque la aplicación está muy bien y cumple con lo deseado, la interfaz es algo fea, pero desde luego no seré yo quien critique eso.
Esquema con la configuración de red.
IP Webcam. Configuración básica.
Nota: Aunque en esta entrada solo mencione el uso de la app como webcam, tengo que decir que tiene muchos otros usos, ya que podemos usarla como vigila-bebes, como cámara de seguridad (tiene incluso detección de movimiento), tiene compatibilidad con Automagic(gracias al plugin de Tasker). Como suele decirse ¡El cielo es el límite!
Lo primero será permitir la ejecución en segundo plano de la aplicación, esto solo será necesario si quieres poder apagar la pantalla del móvil mientras lo utilizas como webcam o si quieres minimizar la aplicación para hacer otras cosas. Por ejemplo mantener una ventana de chat abierta, alguna nota, un servidor x11, etc.
Para ello vamos a la app y en Permisos adicionales encontraremos la opción.
En la parte de Preferencias de vídeo podemos cambiar tanto la cámara principal (trasera/delantera) como la resolución. Esta segunda opción nos será muy útil en Skype.
En la parte de Retransmisión local estableceremos el usuario y contraseña (recomendable).
Finalmente cuando tengamos todo configurado a nuestro gusto, podemos ir a la parte de abajo del todo y pinchar en Iniciar servidor. Esto nos mostrará nuestra cámara y nos dará algo de información en la parte inferior sobre como podemos conectarnos.
Captura del móvil una vez iniciado el servidor.
Capturar la señal de vídeo desde el ordenador.
El proceso será el mismo que en la entrada anterior, así que iré rápido.
# Crear la cámara virtual:
sudo modprobe v4l2loopback video_nr=0 card_label="Android camera"
# Iniciar la cámara:
input=https://geek:erratico@192.168.1.31:8080/videofeed
ffmpeg \
-re \
-i $input \
-map 0:v \
-vcodec rawvideo \
-vf format=yuv420p \
-f v4l2 \
/dev/video0
Aquí lo importante es la entrada (el parámetro -i
). En este ejemplo:
- Mi usuario es:
geek
- Mi contraseña es:
erratico
- La ip de mi móvil es:
192.168.1.31
- El puerto en el que escucha la app es:
8080
Si todo ha ido bien, se quedará el ffmpeg
ejecutando la captura hasta que decidamos pararlo. Para ello pulsamos "Ctrl + c" o bien cerramos la aplicación en el móvil.
Ver correctamente la cámara en Skype.
Por motivos que desconozco, Skype no admite cámaras con una resolución superior a 800x600. Esto es algo que descubrí a golpe de prueba y error, pero que me frustró mucho las primeras veces hasta que me dí cuenta del detalle.
Para solucionar esto hay dos opciones:
- Cambiar la resolución en la configuración de la aplicación móvil.
- Redimensionar con el ffmpeg.
Yo personalmente recomiendo la primera. El motivo es que poner una resolución más alta y después redimensionar no hará que la imagen gane calidad, sino más bien lo contrario (puede deformar la imagen). Además a veces me pasa que con resoluciones más altas el vídeo va con retraso.
Por cierto, si os pasa esto, reiniciar el ffmpeg y/o la app, a veces se soluciona.
Esto es como quedaría el comando si decidimos redimensionar (útil si queremos emitir otro contenido como un vídeo de Youtube o un stream de OBS).
input=https://geek:erratico@192.168.1.31:8080/videofeed
ffmpeg \
-re \
-i $input \
-map 0:v \
-vcodec rawvideo \
-vf format=yuv420p \
-s 800x600 \
-f v4l2 \
/dev/video0
Pantalla de configuración de la cámara en Skype
Finalmente dejo el script que uso para iniciar el ffmpeg sin tener que calentarme mucho la cabeza:
#!/bin/bash
# Script: ipcam.sh
# Autor: McA
# Sitio: http://geekerratico.blogspot.com
# Versión: 1.0
# Variables:
# SKYPE : Forzar la imagen a 800x600 (sin este tamaño no funciona la cámara en Skype).
# MIRROR: Voltear la imagen como en un espejo.
# HOLD : Dejará cargado el módulo de kernel al terminar (opción ideal si se usa el script el un bucle).
# Dependencias:
# v4l2loopback-dkms, v4l-utils, ffmpeg.
# Skype:
# En el móvil configurar la resolución de la cámara a 800x600 (otras resoluciones no he conseguido hacerlo funcionar).
# Otra opción es usar el parámetro "-s" ejemplo:
# ffmpeg -re -i $input -map 0:v -vcodec rawvideo -vf format=yuv420p -s 800x600 -f v4l2 $video
label="Android camera"
input=${1:-https://mca:wololo@192.168.1.31:8080/videofeed}
load_v4l2(){
sudo modprobe v4l2loopback video_nr=0 card_label="$label" || exit 1
video=/dev/video0
}
lsmod | grep -q v4l2loopback && {
for video in /dev/video*; do
v4l2-ctl --info -d "$video" | grep -q -E "Card type +: +$label$" && break
done
} || load_v4l2
ffmpeg \
-re \
-i "$input" \
-map 0:v \
-vcodec rawvideo \
-vf format=yuv420p${MIRROR:+,hflip} \
${SKYPE:+-s 800x600} \
-f v4l2 \
$video
[[ -z $HOLD ]] && sudo rmmod v4l2loopback
Le he puesto varias opciones.
SKYPE=1 MIRROR=1 ipcam.sh video_gracioso.mkv
Por ejemplo con el siguiente comando ocurrirá que:
- Se emitirá un "vídeo gracioso" en vez de usar la cámara del móvil.
- Se voltea horizontal el vídeo ya que sino salen los textos invertidos.
Hay una opción más que es la del HOLD=
. Esta opción evitará que se desmonte el módulo una vez termine el vídeo. Es ideal si se quiere usar el script en bucle. Por ejemplo:
while :; do
sudo SKYPE=1 MIRROR=1 HOLD=1 ipcam.sh video_gracioso.mkv
sleep 1
done
sudo rmmod v4l2loopback
Y esto es todo. Espero que te sea útil el tutorial.
¡Un saludo!