Il existe des millions de forums et de discussions sur la suppression d'une latence de 5 secondes lors de l'utilisation d'un Pi avec une PI-Cam comme caméra de surveillance. De nombreux didacticiels montrent comment utiliser vlc pour coder et diffuser les images à l'aide du protocole RTP, ce qui entraîne un décalage d'environ 5 secondes.
Selon moi, la raison en est que raspivid est en train de coder le flux en H264, tandis que VLC doit le décoder à nouveau et le recoder à tout RTP. La ligne de commande ressemble à ceci:
raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
La première partie indique à raspivid de diffuser la vidéo sur la sortie standard:
raspivid -w 640 -h 480 -o - -t 0
La partie après le tuyau, dit à VLC de la récupérer et de la décoder à l'aide de h264:
cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
Ce multiplexage et démultiplexage représente une véritable somme de ressources!
J'ai trouvé les sources de raspicam sur github, et je pense que quelque chose peut être fait dans la méthode encoder_buffer_callback (actuellement à la ligne 848) pour ignorer l'encodage. Cependant, je ne suis pas bon en c et je ne connais pas du tout l'encodage vidéo, donc je n'ai aucune idée par où commencer.
Sur Github, je peux voir 330 fourches, mais elles ne semblent pas être spécifiquement pour raspicam (plutôt pour l'ensemble du projet userland). Je me suis perdu en essayant de trouver un fork qui supprimait l'encodage ou implémentait quelque chose de plus simple comme mjpeg.
Quelqu'un avec des connaissances en codec c et vidéo pourrait-il m'aider, ainsi que les autres utilisateurs de gazillions, à se débarrasser de la latence? La solution est probablement déjà disponible dans l'une de ces fourchettes, mais j'ai passé des heures à la chercher sans aucune chance.
ps Je ne cherche pas de solution de navigateur , mais je veux finalement la diffuser sur une Synology, de préférence en utilisant le streaming mjpeg (mais pas via une page Web, plutôt un flux mjpeg standard intégré à la plupart des caméras IP commerciales). La première étape consiste à se débarrasser du h264.
la source
Réponses:
Ce n'est probablement pas ce que vous attendez des réponses, mais je ne recommande pas du tout le streaming VLC ..
Pour un projet d'école, j'ai essayé quelques options de streaming (sur RPi aussi!):
En utilisant VLC et MJPEG (et quelques autres moins connus), j'ai eu une latence entre 3 et 5 secondes ..
En utilisant GStreamer, NO LATENCY et avec une meilleure résolution (et beaucoup plus d'options)!
Si vous êtes intéressé, vous pouvez le vérifier ici .
Et si vous l'utilisez, voici mon pipeline:
la source
Certaines personnes ont travaillé dur sur ce sujet depuis que j'ai posé cette question pour la première fois, et à ce moment-là, il existe quelques options (étrange que personne n'ait encore répondu à cette question). J'ai essayé RaspberrIPCam et j'ai eu un certain succès, mais il semble que les paquets rtsp aient un TTL extrêmement court ou quelque chose. Ayant le Pi connecté directement à un routeur à côté de mon PC, cela fonctionnerait parfaitement. Mais dès que j'ai installé la caméra là où je le voulais, et essayé d'accéder au flux avec deux routeurs entre, aucune image n'arriverait. J'ai vérifié le code source et trouvé le TTL réglé au maximum. Je ne l'ai jamais complètement compris.
Actuellement, je recommanderais RaspberryIPCamera qui a une belle interface utilisateur (voir captures d'écran ) et il y a même une image de carte SD prête à l'emploi. J'ai essayé la carte SD, mais j'ai recommencé à faire une installation manuelle comme décrit ici avec beaucoup de succès (ma configuration actuelle). Des instructions pour le connecter à un Synology DiskStation sont également disponibles et fonctionnent parfaitement sur mon système. Le problème avec l'image de la carte SD était que je ne pouvais pas étendre le système de fichiers sur toute l'étendue de la carte SD (je veux également exécuter d'autres choses dessus pour contrôler certains relais via les broches GPIO).
La solution ci-dessus utilise des composants du projet UV4L. La documentation du projet UV4L sur cette page mentionne également:
Je n'ai pas encore essayé le lac pour le moment (puisque je ne veux pas gâcher ma configuration actuelle).
la source