RASPBERRY PI COMO CÁMARA DE VIDEOVIGILANCIA

English version

INTRODUCCIÓN

Ésta es la primera de las publicaciones que tengo pensado publicar para describir la configuración de un servicio de video vigilancia doméstico partiendo de los dispositivos que tengo a mano:

  • un par de placas Rasbperry Pi (en adelante rpi) modelos 1 B+ y 2 B.
  • y un módulo de cámara de visión nocturna (Omnivision OV5647).

Por ahora, describiremos como configurar la Rasbperry Pi 1 B+ para proporcionar video en vivo.

En futuras publicaciones se describirá:

  • como configurar la segunda rpi 2 B:
    • incluyéndole un servidor de video vigilancia (zoneminder)
    • y la conexión a un modem a fin de poder enviar avisos en cualquier teléfono.
  • Retomaremos la primera rpi 1 B+ para instalarle un servidor de audio

Una vez configurado, dispondremos de un sistema de videovigilancia accesible desde internet con las siguientes funcionalidades:

  • Detección de movimiento.
  • Sistema de alarmas y aviso telefónico.
  • Grabación de video, contínuo y/o ante alarmas
  • Sistema de audio remoto que nos permitirá, entre otras funcionalidades, dar alguna que otra consigna a los posibles allanadores de nuestro hogar.

rpi rtsp img

Si el tiempo lo permite, se describirá el control de dispositivos con su interfaz GPIO para integrarlos en nuestro sistema de alarmas y automatización:

  • Sensores detectores:
    • de CO2
    • temperatura y humedad
    • apertura de puertas y ventanas
  • Domótica en general, controlando y automatizando:
    • la caldera de la calefacción
    • iluminación, persinas,…

 

NOTA: En la sección descargas al final de este documento se incluyen los enlaces a todos los fuentes y binarios utilizados.


 
 

HARDWARE

Partiendo de una RASPBERRY PI B+ y una módulo cámara Omnivision OV5647de visión nocturna, construiremos una especie de cámara IP.
Entrando en detalle, describiremos la configuración un servidor de video RTP (RTSP) con formato H.264 (MPEG-4 Part 10) que nos proporcionará video en vivo de la cámara, útil como:

  • «cámara remota» para el servidor de video vigilancia (zoneminder).
  • su visualización en cualquier navegador o cliente de video RTP (vlc, mplayer, ffmpeg, …).

ESPECIFICACIONES DE LA CÁMARA

  • Raspberry Pi Night Vision Camera, supports all revisions of the Pi
  • 5 megapixel OV5647 sensor
  • Camera specifications
    • CCD size : 1/4inch
    • Aperture (F) : 1.8
    • Focal Length : 3.6MM (adjustable)
    • Diagonal : 75.7 degree
    • Sensor best resolution : 1080p
Camera OV5647


 
 

CONFIGURACIÓN DE SERVICIOS DE VIDEO

 

FFSERVER

FFMPEG: problemas con arm6 (raspbian jessie)

Utilizaremos ffserver como codificador de video y servidor de estado de la cámara.
El binario distribuido por jessie parece estar compilado para procesadores arm7 y no es compatible para el el arm6 de las raspberry Pi 1, así que es necesario compilarlo.
La ejecución de lsinfo nos indica la arquitectura y modelo del procesador de la raspberry (lineas 2 y 9).

$ lscpu
Architecture:          armv6l
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
Model name:            ARMv6-compatible processor rev 7 (v6l)
CPU max MHz:           700.0000
CPU min MHz:           700.0000

En la sección descargas , al final de este documento, se incluyen los binarios que generé ffmpeg-v2.7.2.

FFSERVER: configuracion

A continuación mostramos el fichero de configuración (/etc/ffserver.conf) para nuestro codificador.
En éste, las lineas 13 y 28 (ACL allow 10.0.0.0 10.255.255.255) deben estar acorde con la configuración de red que se disponga (generalmente 192.168.0.0 192.168.255.255)
Las líneas 19 a 21 permiten configurar los frames por segundo, la resolución y el ratio de bits del video a codificar.

HTTPPort 8090
HTTPBindAddress 0.0.0.0
MaxClients 10
MaxBandwidth 1000

RTSPPort 8554
RTSPBindAddress 0.0.0.0


 File /tmp/feed1.ffm
 FileMaxSize 10M
 ACL allow localhost
 ACL allow 10.0.0.0 10.255.255.255



 Format rtp
 Feed feed1.ffm
 VideoFrameRate 4
 VideoSize 600x480
 VideoBitRate 320
 NoAudio



   Format status
   ACL allow localhost
   ACL allow 10.0.0.0 10.255.255.255

 

FFSERVER: comprobación de estado

Una vez iniciado (baste con ejecutar ffserver), el estado del codificador está accesible en la URL:

http://<Raspberry Pi IP>:8090/stat.html

y nos ha de mostrar algo tal que:

ffserver stats

FFSERVER: arranque automatizado

Para su ejecución automática al inicio del sistema, haremos uso del servicio supervisord (instalación: sudo apt-get install supervisor).
Añadiremos el siguiente archivo de configuración ffserver.conf al directorio /etc/supervisor/conf.d/

[program:ffserver]
command=/usr/local/bin/ffserver
directory=/tmp
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/supervisor/ffserver.err.log
stdout_logfile=/var/log/supervisor/ffserver.out.log
user=pi

 

FFMPEG: RTSP H264 STREAMING

FFMPEG: «zm_streaming», el script de streaming

Hasta ahora tenemos a ffmpeg codificando el video de la cámara en /tmp/feed1.ffm. Ahora, mediante ffmpeg, reenviamos ese flujo de video como rtp h264 con el siguiente script de python que copiaremos en /usr/local/bin/zm_streaming:

#! /usr/bin/env python
import subprocess
p1 = subprocess.Popen(["raspivid", "-b", "5000000", "-ex", "night", "-mm", "average", "-op", "150", "-t", "999999999", "-w", "640", "-h", "480", "-fps", "4", "-o", "-cat"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["ffmpeg", "-i", "-", "-flags", "+global_header", "-vcodec", "copy", "-r", "4", "-an", "http://0.0.0.0:8090/feed1.ffm"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # p1 will receive SIGPIPE if p2 exits

En él, entre otros parámetros, podemos modificar el formato de video (ancho, alto y frames por segundo): «-w», «640», «-h», «480», «-fps», «4».

FFMPEG: arranque automatizado del script de streaming

Volviendo a hacer uso de supervisor, creamos el siguiente archivo en /etc/supervisor/conf.d/zm_streaming.conf para el arranque automatizado de nuestro servicio de streaming rtp h264 «zm_streaming».

[program:zm_streaming]
command=/usr/local/bin/zm_streaming 
directory=/tmp
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/supervisor/zm_streaming.err.log
stdout_logfile=/var/log/supervisor/zm_streaming.out.log
user=pi

 

EL MOMENTO DE LA VERDAD

INICIO DE LOS SERVICIOS DE VIDEO

Tras un reinicio debiéramos tener disponible nuestro servidor de vide en vivo.
Pero viviendo en el distinguido mundo *NIX, no hay nada más elegante que una prueba sin reinicio:

  $ sudo supervisorctl start ffserver
  $ sudo supervisorctl start zm_streaming

Supervisor nos permite comprobar el estado de los servicios mediante el comando status:

  $ sudo supervisorctl status ffserver

Y si todo ha ido bien, nos indicará ambos como «RUNNING»:

$ sudo supervisorctl status
  ffserver                         RUNNING    pid 651, uptime 5:35:35
  zm_streaming                     RUNNING    pid 656, uptime 5:35:35

Como comentamos con anterioridad , disponemos de un servicio web para comprobar el estado del servicio.

REPRODUCCIÓN DEL VIDEO – VLC

Ya tenemos disponible nuestro video en vivo y podemos comprobarlo abriendo la dirección:

rtsp://<rpi IP>:8554/live.sdp

con VLC (File->Open Network – Network tab).

REPRODUCCIÓN DEL VIDEO EN NAVEGADORES

Podemos incluir en nuestro ffserver un streaming para navegadores incluyendo la siguiente entrada en el fichero de configuración /etc/ffserver.conf.
El video estará disponible en:

http://<rpi IP>:8554/live.mjpg
<Stream live.mjpg>
  Feed feed1.ffm
  Format mpjpeg
  VideoFrameRate 4
  VideoSize 600x480
  VideoBitRate 320
  VideoIntraOnly
  NoAudio
  Strict -1
</Stream>

 
 
 


DESCARGAS

– Archivos de configuración: zm-v1.0.0.tar.bz2
– Ffmpeg v2.7.2 compilada para arm6: ffmpeg-v2.7.2.tar.bz2

 
 

Deja un comentario