Wireless Video de Raspberry Pi a PC

Vamos a documentar como hacer una transmisión de video con la Camara Raspberry Pi a un PC. Como objetivo adicional nos proponemos crear un dispositivo autónomo que transmita imágenes mediante wifi en vivo, similar a una cámara wireless de seguridad.

Veremos que la Raspberry Pi camera board es un modulo diseñado para ser integrado con facilidad en el Pi.

La cámara posee una relación calidad-precio notable:

    • Tamaño 25mm x 20mm x 9mm
    • Peso 3g
    • Bajo consumo
    • 5 Megapixels
    • 2592 x 1944 pixeles de imágenes estáticas
    • Soporta video 1080p30, 720p60 y 640x480p60/90
    • Cuesta menos de 25 Euros

Contamos con un Raspberry Pi B 512K de memoria, ya nos hemos aproximado varias veces a micro placas

https://unpocodejava.wordpress.com/2013/07/05/java-en-un-raspberry-pi-desde-cero-2/
https://unpocodejava.wordpress.com/?s=raspberry+pi

Y tenemos un avance de los esfuerzos por tener una distribución de Java en un Pi:

https://unpocodejava.wordpress.com/2012/05/30/java-corriendo-intentando-correr-sobre-raspberry-pi/
https://unpocodejava.wordpress.com/2012/08/14/corriendo-tomcat-7-en-un-raspberry-pi/

 

Instalación


La instalación es muy sencilla. La banda se inserta en el conector plano entre la Ethernet y el HDMI. Primero es necesario levantar una pestaña tirando hacia arriba:

Después se inserta la faja de la cámara, con la parte plateada orientada hacia el puerto HDMI

Cuando esté bien colocada, se baja de nuevo la pestaña y listo.

 

Configuración


Arrancamos el Pi y nos autenticamos. El nombre y password por defecto, como ya hemos visto en otros tutoriales es

usuario: pi
password: raspberry

Actualizamos el firmware y librerías del Pi a la última versión:
>sudo apt-get update
>sudo apt-get upgrade

Accedemos a la configuración del Pi con el comando
>sudo raspi-config

Navegamos al menú camera y seleccionamos enable

image014

image018

Seleccionamos Finish y reiniciamos

En el tutorial anterior java-en-un-raspberry-pi-desde-cero, podemos encontrar como instalar wifi y un servidor remoto vnc en el Pi. En http://www.raspipc.es podemos encontrar baterías recargables de 5v – 1mA y una toma usb, como esta:

Con esto y un poco de esparadrapo, quedamos totalmente wireless para mover la cámara en busca de la mejor toma.

 

Pruebas Locales


Procedemos testear que la instalación de la cámara funciona correctamente. El commando raspivid permite realizar capturas de video, mientras que raspistill captura imágenes fijas.

Escribamos en la consola el siguiente comando:
>raspistill -v -o test.jpg

Que muestra 5 segundos de vista previa por defecto y toma una foto, salvándola en el fichero test.jpg,

Hay que destacar que no es posible ver la vista previa desde el cliente remoto vnc.

-o ó –output el nombre del fichero y -t ó –timeout especifica los milisegundos de vista previa.
-d ó –demo ejecuta el modo demo que rota a través de varios efectos de imagen

Comandos de Ejemplo
Captura 5s de video en formato h264:
>raspivid -o video.h264

Capturar 10s de video:
>raspivid -o video.h264 -t 10000

Captura 10s de video en modo demo:
>raspivid -o video.h264 -t 10000 –d

Para más información acerca del uso de estos comandos, referirse a la bibliogrfia o a la ayuda de los propios comandos:
>raspivid | less
>raspistill | less

 

Desactivar Led de la Cámara

La cámara incluye un LED en la esquina que se enciende cuando la cámara esta activa.

Este led se puede desactivar editando el fichero
>sudo nano /boot/config.txt

y añadiendo la linea
>disable_camera_led=1

 

Streaming con VLC


VLC es una plataforma opersource que interpreta la mayoría de formatos multimedia. Para hacer streaminf vlc, necesitamos descargar en el PI el software

>sudo apt-get install vlc

Un método muy eficiente para hacer stream es el vía protocolo RTSP

>raspivid -o – -t 3600000 -w 800 -h 600 -fps 31 |cvlc -vvv stream:///dev/stdin –sout ‘#rtp{sdp=rtsp://:8554/}’ :demux=h264

El comando activa la cámara y el puerto 8554 es configurado como canal de stream, a la escucha de suscriptores.

Podemos jugar con los valores -w (ancho en pixels), -h (alto en pixels), -fps (fotogramas por segundo) para conseguir mayor velocidad de transmisión.

Para ver el stream debemos instalar el cliente VLC en un PC, descargable desde http://www.videolan.org/.

Para suscribirnos a la dirección de stream hay que abrir en el menú Abrir volcado de red…

La dirección:
>rtsp://<IPdeRaspberryPi>:8554/

por ejemplo, un PC en la red local podría tener esta IP

Pulsamos en reproducir y comenzaremos a ver el video en el reproductor.

Los pros de este método son

  • Facilidad de configuración
  • Conexión de múltiples clientes
  • Fácil acceso a traves de routers (se podria configurar streaming a mediante protocolo http de un modo similar).
  • La aplicación se integra en multiples plataformas, como lynux y android

Los contras.

  • Pese a haber probado múltiples configuraciones en cliente y en servidor, el protocolo rtsp tiene una latencia de hasta 10 segundos en la LAN. Esto provoca un desfase que hace imposible el uso en tiempo real de una conexión.

Este un problema conocido y el autor del post aun no ha encontrado una solución factible.

 

Streaming Punto a Punto con MPlayer


Al contrario que el protocolo anterior El stream punto a punto envía la señal del raspberry pi directamente a la IP del reproductor. Para ello necesitamos dos programas:

  • Netcat es una utilidad de red que redirige flujos de lectura/escritura utilizando tcp/udp.
  • MPlayer es un reproductor opensource que interpreta los formatos mas habituales.
  • Tomamos como ejemplo un PC con sistema Windows. Tenemos que instalar ambos programas, descargables desde

https://dl.dropboxusercontent.com/u/106074492/mplayer%20and%20netcat.zip

y los descomprimimos en un directorio de trabajo, por ejemplo d:/pro/netplayer

Para arrancar la escucha en el PC, ejecutar en el directorio de trabajo

>d:
>cd pro
>cd netplayer
>nc -l -p 5001 | mplayer -vo direct3d -fps 31 -cache 2048 -nosound -framedrop –

que genera un socket de escucha (-l) en el puerto 5001. De ahí, enruta (|) el stream de información al reproductor MPlayer con la siguiente configuración:

  • Interpreta 31 fotogramas por segundo
  • Con un cache de 2MB
  • Deshabilitamos el sonido (la cámara no tiene micrófono)
  • En caso de falta de información, tirar el fotograma
  • Es muy importante es seleccionar el driver de output de video. En las pruebas direct3d ofrece un rendimiento muy correcto.

El programa se queda a la escucha de un stream entrante.

En la parte del Pi necesitamos descargar el software:
>sudo apt-get install mplayer netcat

y activamos la cámara para enviar el stream de video con el comando
>raspivid -o – -vf -t 3600000 -w 800 -h 600 -fps 31 -n| nc <IPdePC> 5001

conocemos el comando raspivid; con el pipe mandamos la información al netcat, que manda el stream a la IP y puertos especificados.

En la parte del PC, se abre el reproductor mplayer:

Los Contras de este método son:

  • No es posible enviar más que a un solo destinatario
  • Configuración muy rígida, es necesario que el PI conozca la IP del destinatario
  • El mplayer no esta tan extendido en diferentes plataformas como el VLC

Los Pros:

  • Muy baja latencia, menos de 0.5 segundos en la LAN.
  • Debido a la velocidad, este método es válido para imagen en tiempo real.

     

    Solución Múltiples Clientes


    Si fuera necesario conectar múltiples clientes (de distintos sistemas operativos) al stream, una solución sencilla podría ser usar el PC como “Gateway” de video y conectarse mediante vnc.

    Los clientes VNC existen para múltiples plataformas. En el “gateway” (PC), instalar y ejecutar el servidor vnc desde http://www.realvnc.com/

    El puerto de escucha por defecto es el 5900, es posible cambiarlo desde la sección options.

    La pantalla de conexión del cliente es como la siguiente:

    Escribimos la ip:puerto del servicio vnc (5900) del Gateway PC y pulsamos connect. La primera vez dara un aviso (por no tener el certificado) y pasara a la ventana de autenticación:

    Y sin más problemas accederemos al escritorio.

    En mi experiencia, la elección del driver de reproducción mplayer (opción –vo) afecta drásticamente a la calidad de la imagen remota.

    Si accedemos desde fuera de la LAN al gateway, tener en cuenta que hay que poner la IP externa (consultar en www.whatismyip.org) y configurar el router para redespachar la señar a la IP/puerto internos correspondientes:

    Existen diversas implementaciones para VNC desde android. Debido que en los dispositivos móviles la banda limitada de datos, si queremos conseguir imagen a tiempo real se recomienda:

    • Quitar fondos, temas y efectos visuales del escritorio del gateway
    • Definir la resolución de la maquina Gateway lo mas parecida al tamaño de la pantalla (se podría configurar que corriera en full screen)
    • Bajar los colores del cliente vnc a 256
    • Bajar los fps, width y height del transmisor (Pi)

     

    Referencias


    Tutorial de iniciación a la cámara
    http://www.adafruit.com/products/1367

    Documentación Raspicam mas en profundidad
    http://www.raspberrypi.org/wp-content/uploads/2013/07/RaspiCam-Documentation.pdf

    Resumen de conexión VLC con protocolos rtsp/http/hsl
    http://www.mybigideas.co.uk/RPi/RPiCamera/

    Tutorial configuración punto a punto MPlayer
    http://smokespark.blogspot.com.es/2013/06/26-streaming-live-video-from-raspicam.html

Respuestas

  1. Peazo post Miguel!!!Buf!!!!quien yo me sé tiene que estar contenta 😀

  2. Avatar de Francisco Javier
    Francisco Javier

    hola buenas tardes, me gusto muchisimo su post pero me gustaria saber mas a fondo como hicieron el sistema autonomo de fotografias

  3. estoy haciéndome una aplicación que necesito recibir streaming. He probado el ejemplo que has puesto con netcat y mplayer pero no tengo ni idea de como meter el video en un jpanel de java.

    ¿me puedes decir como podría hacerlo?

    muchas gracias de antemano

Deja un comentario