jueves, 8 de agosto de 2013

Streaming de video desde RaspberryPi (parte 4)

Con la Raspicam (Raspberry Pi Camera Board)

Bueno, despues de 583 intentos más, retomo el tema del videostreaming, en este caso con la raspicam, la cámara "oficial" de Raspberry Pi, con muy buena pinta, no muy cara ... pero que en mi caso es un poco desilusionante (por ahora).

No voy a entrar a especificar como instalar y probar la raspicam, porque para eso tenemos la web oficial, con todo explicado muy clarito.
Una vez que hemos comprobado que efectivamente funciona, te darás cuenta que no te crea un dispositivo de video linux, del tipo /dev/videoX, como si haría cualquier webcam usb. Se supone que como está en beta (seguramente nunca pasará de ahí) "si quieres que haga algo, prográmalo tú mismo"
¿Y esto qué quiere decir? Pues que en realidad la raspicam es un dispositivo externo de vídeo  por lo que la vamos a pasar canutas para poder trastearla.
Después de pelearme con el cacharro y ver 200 ejemplos en youtube, google, foros, grupos ... he visto que la mejor forma de usarla para hacer streaming, es capturando fotos, por lo que la característica de "30 fps a 1080p", mejor la vamos olvidando.
Bueno, necesitamos mjpg-streamer, que he instalado de nuevo siguiendo mis propias instrucciones.

Capturando fotogramas

Vamos a tener una tasa de refresco de 2 FPS (más o menos) con hasta 1080p de calidad. Para ello ejecutamos:
mkdir /tmp/stream/
raspistill -w 640 -h 480 -q 10 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0
Esto captura a la calidad que le indiquemos (640x480 para las pruebas) y lo guarda continuamente en un único archivo de imagen /tmp/stream/pic.jpg. La calidad esta a un 10% (parámetro -q), cuanto más la aumentes, más ancho de banda necesitarás.

Captura a 640x480:
Captura a 1920x1080:

Configurando el streaming

Como ya he comentado, necesitamos tener instalado el mjpeg-streamer. Para lanzarlo correctamente, ejecutaremos:
cd /usr/src/mjpg-streamer/mjpg-streamer/
/mjpg_streamer -i "/usr/src/mjpg-streamer/mjpg-streamer/input_file.so -f /tmp/stream/" -o "/usr/src/mjpg-streamer/mjpg-streamer/output_http.so -w /usr/src/mjpg-streamer/mjpg-streamer/www/"
Creo que no necesita más explicaciones. Ahora desde un navegador (que puede ser el del Android) vamos a http://ip_del_raspberry:8080 y ahí veremos una web con varios ejemplos, vamos al menú de la izquierda y seleccionamos stream, que es el más compatible. Puedes directamente ir a http://ip_del_raspberry:8080/stream_simple.html que de hecho es la url que tendrás que configurar en ZoneMinder o cualquier otro.

Resultados

En la parte de calidad, es perfecto, 1080p, ahí no hay quejas. La tasa de refresco es algo baja, unos 2 FPS, pero aún así es mayor que las cámaras de seguridad convencionales.
La mejor parte es sin duda la carga de micro, que no llega ni al 2%:
Lo siguiente es combinar la raspicam con dos servos para hacer una torreta de vigilancia e integrarla con OpenCV para detectar movimientos, gestos, caras y personas. Y posiblemente le ponga un arma para matar zombies.

13 comentarios:

  1. Buenas,
    Igual es que hoy estoy mas espeso que otros dias pero ¿2FPS = 2 Frames por segundo? Me parece poquisimo!

    Y si te puedo hacer la consulta... por que utilizas rapistill en vez de raspivid? este comando te permite elegir tamaño de imagen y fps mediante los parametros, y usando vlc podrias recodificar al vuelo (dentro de las limitaciones de la reaspberry, claro.)

    Vi informacion al respecto en http://www.mybigideas.co.uk/RPi/RPiCamera/

    ResponderEliminar
    Respuestas
    1. eso ya lo probé, pero necesito que sea compatible con algo standard, necesito verlo desde android, windows, smartv, por dlna, java, xbmc, OpenCV, motion, zoneminder, ... y así es de la única forma que lo he conseguido. Con el añadido que necesitaba un retardo de un segundo o menos.
      2 FPS, son 2 fotogramas por segundo ... un ñordo.

      Eliminar
    2. si kieres mas fps puedes stremear en vez de cn raspistill a base de imagenes cn raspivid stremearlo a su vez cn netcat luego ya en el pc que quieras rediriges el stream hacia una named pipe y luego lo lees cn un script de opencv en el lenguaje que quieras o simplemente via mplayer , con eso tienes 32 fps facil que creo k es el maximo que soporta la picamara


      el pc ubuntu/debian(supongo que windows tendrá sus comandos equivalentes, pero en el caso de netcat influye mucho la versión):

      $sudo nano streamScript.sh
      #!/bin/bash
      #comprobamos si existe el pipe i si existe lo borramos.
      if [ -p fifo.stream ]
      rm fifo.stream
      fi
      #creamos un nuevo pipe
      mkfifo fifo.stream
      #escuchamos el stream cn netcat i lo guardamos dentro del pipe

      nc -l -v -p 6969 > fifo.stream

      guardamos el archivo y le damos permisos $sudo chmod 755 streamScript.sh


      en la pi:

      raspivid -hf -w 600 -h 480 -o - -t 0 -fps 32 -b 20000000 | nc 192.xxx.xxx.xxx 6969

      con eso empezamos el stream i lo pasamos por socket via netcat a la direccion ip tiene que ser la del pc que ara de server donde ejecutaremos el script anterior.

      luego ya depende del lenguaje que utilizes para programar desde c solo capturalo desde stdin '/dev/stdin' desde python bueno mejor os paso la solucion de python en overflow no es muy complejo. pero si largo de explicar aki. xD https://stackoverflow.com/questions/35166111/opencv-python-reading-video-from-named-pipe

      si kieres mas resolucion solo subela no ifluye mucho en los fps finales, los fps que tendras depende mas de tu conexion a internet. Si no te interesa reeditarla cn ningun lenguaje solo pasa del script de la pipe y en vez de pasarselo, lo pasas por ejemplo al mplayer:

      nc -l -v -p 6969 | mplayer -fps 200 -demuxer h264es -

      un saludo espero k le sirva a alguien xP

      Eliminar
  2. Felicidades, la verdad me molan tu tutos son interesantisimos, espero ver la torreta con los 2 servos tiene que ser una pasada.

    ResponderEliminar
  3. Cuidado con tu gato! Domokun está escondido en la estantería!! :O

    ResponderEliminar
  4. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Este comentario ha sido eliminado por el autor.

      Eliminar
  5. Aqui os dejo un video tutorial de raspi con netcat y en el pc mplayer

    sin apenas retado , y he conseguido 1024x768 sin retardo .

    el video esta en youtube : Raspberry pi camara en castellano

    ResponderEliminar
    Respuestas
    1. Hola, esa es una solución a medias, como ya he comentado en otra ocasión ¿cómo integras eso con motion o cualquier otro?

      Eliminar
  6. Esto es lo mejor que es visto con respecto poco retardo en streaming con las raspberry

    http://raspberrypiwonderland.wordpress.com/2014/01/15/awesome-camera-app/

    ResponderEliminar
  7. sudo modprobe bcm2835-v4l2 y ya tienes el /dev/video0 para funcionar con motion o lo que se antoje. Saludos

    ResponderEliminar