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

Capturez le flux RTSP de la caméra IP et stockez

J'ai quelques caméras IP qui émettent un flux RTSP (h264 mpeg4).

En accédant à l'URL localement via VLC : rtsp://192.168.0.21:554/mpeg4

Je peux diffuser la caméra en continu et la vider sur le disque (sur mon bureau). J'aimerais cependant stocker ces fichiers sur mon NAS (FreeNAS). J'ai cherché des moyens de capturer le flux RTSP et de les transférer sur le disque, mais je n'ai rien trouvé.

Est-il possible de capturer le flux sur FreeBSD ou Linux (RaspberryPi) et de vider le contenu du flux sur un disque local à Linux ou FreeBSD - de préférence toutes les 30 minutes ?

EDIT : Le NAS est sans tête (HP N55L ou autre) et les RaspberryPi sont également sans tête.

J'ai déjà regardé dans ZoneMinder mais j'ai besoin de quelque chose de petit. J'espérais pouvoir utiliser Motion pour détecter les mouvements sur le flux, mais cela viendra plus tard.

Réponses (4)

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

Les caméras IP sont de qualité variable, certaines se comportant de manière erratique selon mon expérience. La gestion de leurs flux RTSP nécessite une certaine dose de tolérance aux pannes.

Le projet Live555 fournit une implémentation client RTSP relativement tolérante aux pannes, openRTSP, pour extraire les flux audio/vidéo RTSP via CLI : http://www.live555.com/openRTSP/

Par exemple, pour enregistrer l'audio/vidéo RTSP d'une caméra dans des fichiers au format QuickTime (AVI et MP4 également disponibles), un fichier toutes les 15 minutes :

$ 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

Ces options signifient

-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 suppression de l'option -t fait passer openRTSP par défaut en UDP, ce qui peut réduire un peu le trafic réseau. Vous devrez jouer avec les options afin de trouver la combinaison qui vous convient.

Franchement, les caméras elles-mêmes sont parfois peu fiables, ou simplement mises en œuvre différemment - comme si la fermeture inattendue de la prise n'était pas si inhabituelle.

Parfois, le client openRTSP ne détecte pas ces pépins. J'ai donc choisi de coder un contrôleur en Python en utilisant le module “subprocessus” pour invoquer et surveiller la sortie standard de chaque instance du client openRTSP, et aussi pour vérifier que les fichiers continuent à croître en taille.

Cela semble être un sous-produit de l'industrie de la télévision en circuit fermé qui joue avec les normes, RTSP et ONVIF étant les deux plus fréquemment utilisés.

Heureusement, vous pouvez généralement contourner ces problèmes. À moins que vos caméras IP et votre contrôleur ne soient conçus pour fonctionner ensemble, n'utilisez l'ONVIF qu'une seule fois pour la découverte et la gestion des paramètres.

J'utilise openRTSP sur quelques Raspberry Pi B+ fonctionnant en Raspbian. Chaque flux 1280x1024 occupe environ 8-10% du temps du processeur, et j'ai réussi à faire fonctionner jusqu'à huit caméras par RPi, en écrivant les fichiers sur le stockage NAS. Un autre RPi traite les fichiers terminés avec ffmpeg, en recherchant le mouvement et en produisant des PNG indexés de ces images, pour aider à repérer les effractions.

Il existe un logiciel libre appelé ZoneMinder qui s'occupe de cette dernière partie, mais je n'ai pas pu le faire fonctionner avec mes caméras. Le support ONVIF est nouveau et naissant dans ZM, et il ne semble pas bien faire face aux flux RTSP irréguliers produits par ma ménagerie de caméras IP de moins de 100 $.

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

Si je suis bien votre question, pourquoi n'essayez-vous pas la commande suivante sur un système 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"

Cela devrait permettre d'enregistrer la vidéo par morceaux de 300 secondes. (Notez que la longueur du clip dépendra de vos fréquences d'images d'entrée et de sortie)

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

J'ai juste pensé que je pourrais ajouter mes deux cents et compléter la réponse de BjornR.

Au lieu d'exécuter un cron job pour tuer périodiquement le processus VLC, on pourrait dire à VLC de s'exécuter pendant une durée déterminée et de se fermer ensuite.

C'est la commande que j'exécute sur ma boîte :

/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

Ceci lance le VLC pour la durée spécifiée et se termine ensuite. Le paramètre vlc://quit est nécessaire car VLC arrêterait d'enregistrer et resterait ouvert. Cette commande doit être placée à l'intérieur d'une boucle.

Le seul problème que j'ai trouvé jusqu'à présent est qu'il peut manquer quelques secondes à chaque fois qu'un nouvel enregistrement commence.

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

VLC semble être le candidat idéal pour traiter votre flux Les méthodes de base pour capturer un flux sont décrites sur le site Videolan. J'ai réussi à enregistrer la sortie de ma caméra réseau D-Link DCS-5222 en utilisant la commande suivante :

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

Dans votre cas, cela peut fonctionner pour enregistrer la sortie localement :

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

Je vous suggère d'exécuter un script qui termine ce processus VLC et de lancer une nouvelle instance toutes les 30 minutes car je ne suis pas sûr que VLC soit capable de faire cela.

Comme pour le stockage sur un NAS, il suffit de le monter sur votre système de fichiers local.