2014-06-09 08:56:55 +0000 2014-06-09 08:56:55 +0000
18
18

Capturar el flujo RTSP de la cámara IP y almacenarlo

Tengo unas cuantas cámaras IP que emiten un flujo RTSP (h264 mpeg4).

Pulsando la URL localmente a través de VLC: rtsp://192.168.0.21:554/mpeg4

Puedo transmitir la cámara y volcarla al disco (en mi escritorio). Sin embargo, me gustaría almacenar estos archivos en mi NAS (FreeNAS). Estuve buscando formas de capturar el flujo RTSP y volcarlos al disco pero no encuentro nada.

¿Es posible capturar el flujo en FreeBSD o Linux (RaspberryPi) y volcar el contenido transmitido a un disco local de Linux o FreeBSD - preferiblemente cada 30 minutos?

EDIT: El NAS es sin cabeza (HP N55L o algo así) y las RaspberryPi son sin cabeza también.

Ya he mirado ZoneMinder pero necesito algo pequeño. Esperaba quizás usar Motion para detectar movimiento en el stream pero eso vendrá después.

Respuestas (4)

30
30
30
2015-05-29 22:33:16 +0000

Las cámaras IP son de calidad variable, algunas se comportan de forma errática según mi experiencia. Tratar con sus flujos RTSP requiere una dosis de tolerancia a fallos.

El proyecto Live555 proporciona una implementación de cliente RTSP relativamente tolerante a fallos, openRTSP, para extraer flujos de audio/vídeo RTSP a través de CLI: http://www.live555.com/openRTSP/

Por ejemplo, para guardar el audio/vídeo RTSP de una cámara en archivos en formato QuickTime (AVI y MP4 también disponibles), un archivo cada 15 minutos:

$ openRTSP -D 1 -c -B 10000000 -b 10000000 -q -Q -F cam_eight -d 28800 -P 900 -t -u admin 123456 rtsp://192.168.1.108:554/11

Estas opciones significan:

-D 1 # Quit if no packets for 1 second or more
-c # Continuously record, after completion of -d timeframe
-B 10000000 # Input buffer of 10 MB
-b 10000000 # Output buffer 10MB (to file)
-q # Produce files in QuickTime format
-Q # Display QOS statistics 
-F cam_eight # Prefix output filenames with this text
-d 28800 # Run openRTSP this many seconds
-P 900 # Start a new output file every -P seconds
-t # Request camera end stream over TCP, not UDP
-u admin 123456 # Username and password expected by camera
rtsp://192.168.1.108:554/11 # Camera's RTSP URL

Eliminar la opción -t hace que openRTSP utilice por defecto UDP, lo que puede reducir un poco el tráfico de red. Tendrá que jugar con las opciones para encontrar la combinación que le convenga.

Francamente, las propias cámaras son a veces poco fiables, o simplemente se implementan de forma diferente -como cerrar el socket inesperadamente no es tan inusual.

A veces el cliente openRTSP no capta estos fallos. Así que he optado por codificar un controlador en Python usando el módulo ‘subprocesos’ para invocar y monitorizar el stdout de cada instancia del cliente openRTSP, y también comprobar que los archivos siguen creciendo en tamaño.

Esto parece ser un subproducto de la gama baja de la industria de CCTV que juega rápido y suelto con los estándares, siendo RTSP y ONVIF los dos más frecuentemente abusados.

Afortunadamente, normalmente se pueden evitar estos problemas. A menos que las cámaras IP y el controlador estén diseñados para funcionar bien juntos, sólo utilice ONVIF para el descubrimiento y la gestión de la configuración.

Yo utilizo openRTSP en algunas Raspberry Pi B+ con Raspbian. Cada flujo de 1280x1024 ocupa alrededor del 8-10% del tiempo de la CPU, y he ejecutado con éxito hasta ocho cámaras por RPi, escribiendo los archivos en el almacenamiento NAS. Otro RPi procesa los archivos completados con ffmpeg, buscando el movimiento y produciendo PNGs índice de esos cuadros, para ayudar a detectar los robos.

Hay un esfuerzo de código abierto llamado ZoneMinder que hace esta última parte, pero no pude hacerlo funcionar con mis cámaras. La compatibilidad con ONVIF es nueva e incipiente en ZM, y no parece que se adapte bien a los flujos RTSP irregulares producidos por mi colección de cámaras IP de menos de 100 dólares.

7
7
7
2017-06-26 12:49:23 +0000

Si sigo correctamente tu pregunta, ¿por qué no pruebas el siguiente comando en un sistema Linux (RPi):

ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -vcodec copy -acodec copy -map 0 -f segment -segment_time 300 -segment_format mp4 "ffmpeg_capture-%03d.mp4"

Esto debería guardar el vídeo en trozos de 300 segundos. (Tenga en cuenta que la longitud del clip dependerá de sus velocidades de fotogramas de entrada y salida)

7
7
7
2015-04-01 22:52:30 +0000

Sólo pensé en añadir mis dos centavos y complementar la respuesta de BjornR.

En lugar de ejecutar una tarea cron para matar periódicamente el proceso de VLC, uno podría decirle a VLC que se ejecute durante una cantidad específica de tiempo y se cierre después.

Este es el comando que ejecuto en mi caja:

/usr/bin/vlc -vvv rtsp://192.168.1.128:1554/11 --sout=file/ts:/media/path/to/save/location/recording-$(date +"%Y%m%d%H%M%S").ts -I dummy --stop-time=480 vlc://quit

Esto ejecuta VLC durante el tiempo especificado y luego se cierra. El parámetro vlc://quit es necesario ya que VLC dejaría de grabar y se quedaría abierto. Este comando debe ser colocado dentro de un bucle.

El único problema que he encontrado hasta ahora es que puede perder algunos segundos cada vez que se inicia una nueva grabación.

5
5
5
2014-06-09 12:06:59 +0000

VLC parece un candidato ideal para procesar su flujo Los métodos básicos para capturar un flujo se describen en el sitio web de Videolan. He grabado con éxito la salida de mi cámara de red D-Link DCS-5222 utilizando el siguiente comando:

vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv

En tu caso, esto podría funcionar para guardar la salida localmente:

vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg

Sugeriría ejecutar un script que termine este proceso de vlc y lance una nueva instancia cada 30 minutos ya que no estoy seguro de que VLC sea capaz de hacer esto.

En cuanto al almacenamiento en un NAS, simplemente móntalo en tu sistema de archivos local.