Capture la transmisión RTSP de la cámara IP y almacene

18

Tengo algunas cámaras IP que generan una transmisión RTSP (h264 mpeg4).

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

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

¿Es posible capturar la transmisión en FreeBSD o Linux (RaspberryPi) y volcar el contenido transmitido a un disco local a Linux o FreeBSD, preferiblemente cada 30 minutos?

EDITAR: El NAS no tiene cabeza (HP N55L o algo así) y los RaspberryPi tampoco tienen cabeza.

Ya he examinado ZoneMinder pero necesito algo pequeño. Esperaba tal vez usar Motion para detectar movimiento en la transmisión, pero eso vendrá más tarde.

Keerthi
fuente
¿Por qué no usar VLC para Linux?
LatinSuD
1
¡Vaya, olvidé mencionar que tanto el servidor FreeNAS como el RaspberryPi no tienen cabeza!
Puede usar VLC desde la línea de comandos. No es trivial, pero posible.
LatinSuD
Como RTSP es solo un protocolo, ¿va a volcar el contenido h264 o tengo que obtener VLC para transcodificarlo?
1
Bueno, eso es parte del vudú de la línea de comandos de VLC, y lo siento, es por eso que no te estoy dando una respuesta completa aquí. Creo que no es necesaria una transcodificación completa, pero quizás cambie el contenedor. Espero que aparezca algún experto en VLC aquí.
LatinSuD

Respuestas:

29

Las cámaras IP son de diferente calidad, algunas se comportan de manera errática en mi experiencia. Tratar con sus flujos RTSP requiere una dosis de tolerancia a fallas.

El proyecto Live555 proporciona una implementación de cliente RTSP relativamente tolerante a fallas, openRTSP, para extraer transmisiones de audio / video RTSP a través de CLI: http://www.live555.com/openRTSP/

Por ejemplo, para guardar el audio / video 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

La eliminación de la opción -t hace que openRTSP tenga el valor predeterminado UDP, lo que puede reducir un poco el tráfico de red. Tendrá que jugar con las opciones para encontrar la combinación que más le convenga.

Francamente, las cámaras en sí mismas a veces no son confiables, o simplemente se implementan de manera diferente, como cerrar el zócalo inesperadamente no es tan inusual.

A veces, el cliente openRTSP no detecta estos problemas técnicos. Así que opté por codificar un controlador en Python usando el módulo 'subprocesos' para invocar y monitorear la salida estándar de cada instancia de cliente openRTSP, y también verificar que los archivos continúen 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, RTSP y ONVIF son los dos más abusados.

Afortunadamente, generalmente puede solucionar estos problemas. A menos que sus cámaras IP y su controlador estén diseñados para jugar bien juntos, solo use ONVIF para el descubrimiento único y la administración de configuraciones.

Uso openRTSP en algunos Raspberry Pi B + con Raspbian. Cada transmisión 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 archivos completados con ffmpeg, busca movimiento y produce PNG de índice de esos cuadros, para ayudar a detectar robos.

Hay un esfuerzo de código abierto llamado ZoneMinder que realiza esta última parte, pero no pude hacerlo funcionar con mis cámaras. El soporte de ONVIF es nuevo y naciente en ZM, y no parece competir bien con las transmisiones RTSP irregulares producidas por mi colección de cámaras IP de menos de $ 100.

Kevin-Prichard
fuente
Gran solución Kevin, ¿podría compartir más con la solución de indexación de búsqueda de movimiento / png, al menos dónde profundizar más?
Igor
@ Kevin-Prichard Quería entender: 1. Si pudiera convertir, digamos Analog SD CVSB a flujo IP, ¿funcionaría su solución? (Quiero capturar videos mp4 en fragmentos de 1 hora de cada fuente) ¿Y sería capaz de grabar 300 transmisiones de este tipo en una sola red 24/7 o esto sobrecargaría la red? 2. ¿Es posible convertir SD / CVSB analógico a flujo IP?
CP3O
7

Solo pensé en agregar mis dos centavos y complementar la respuesta de BjornR.

En lugar de ejecutar un trabajo cron para eliminar periódicamente el proceso de VLC, uno podría decirle a VLC que se ejecute durante un período de tiempo especificado y que 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. Se requiere el parámetro vlc: // quit ya que VLC dejaría de grabar y permanecería abierto. Este comando debe colocarse dentro de un bucle.

El único problema que he encontrado hasta ahora es que puede faltar unos segundos cada vez que comienza una nueva grabación.

Juanpi
fuente
7

Si sigo su pregunta correctamente, ¿por qué no prueba 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 video en fragmentos de 300 segundos. (Tenga en cuenta que la longitud del clip dependerá de sus velocidades de cuadros de entrada y salida)

Aldo
fuente
5

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

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

En su 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 finalice este proceso vlc y lanzar una nueva instancia cada 30 minutos, ya que no estoy seguro de que VLC pueda hacer esto.

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

BjornR1989
fuente
1
También puede usar FFMPEG para hacer exactamente el mismo trabajo. Aún necesitará montar su NAS según lo sugiere la respuesta.
Kinnectus