Comment puis-je faire en sorte que Raspivid ignore l'encodage h264? (se débarrasser de la vidéo en streaming de latence de 5 secondes)


11

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.


Il s'agit d'une enquête très approfondie. L'utilisation de MJPEG est hors de question car (à l'époque où je regardais) l'encodeur JPEG intégré n'avait pas de bibliothèque et les logiciels étaient des ordures. J'ai réussi à obtenir un décalage d'environ 1 seconde en utilisant nginx-rtmp (FLV packaged), une construction personnalisée, en HD! Le pi a utilisé environ 30% de processeur, mais VLC a eu du mal à le décoder en raison de trames de synchronisation manquantes et de son FLV :( Mon logiciel de vidéosurveillance a également utilisé le récepteur VLC et 1 flux 720p a utilisé 40% de processeur lorsque j'ai finalement réussi à le faire fonctionner mais était très instable.
Piotr Kula

@ppumkin Je ne pense pas que MJPEG soit hors de question. Une fois que H264 est parti, nous pouvons encoder ce que nous voulons sans avoir la surcharge de décodage et de recodage. En fait, avoir H264 est tout à fait un luxe! Seulement, nous devrions pouvoir l'éteindre. C'est comme un luxueux trône rembourré et recouvert de diamant dans une chambre de toilette exiguë, donc rien d'autre ne rentre dans la pièce (sauf pour une certaine hauteur sous laquelle nous pouvons sauter un peu de haut en bas) ... quand vous ouvrez la porte, vous devez monter sur un haut accoudoir, et quand vous êtes assis, il n'y a pas de place pour vos jambes ...
Louis Somers

Oui, je comprends ce que tu veux dire. J'ai passé des jours à essayer d'obtenir MJPEG de bonne qualité sur mon serveur IP CCTV. Beaucoup de choses ont changé, mais l'encodage JPEG matériel et la tuyauterie directs vers un flux sont inexistants, car l'API n'est pas disponible. Le seul moyen que je connaisse est le logiciel et la meilleure solution que j'ai trouvée était le récepteur JPEG nginx-rtmp. HLS pour iPhone fonctionne très bien en fait, mais il a un décalage de 5s-10s :(
Piotr Kula

1
Vous pourriez essayer de soulever cela comme une question sur le projet Github pour le logiciel de l'appareil photo. Vous obtiendrez probablement une explication des raisons pour lesquelles il est difficile de le faire, mais si d'autres la trouvent utile, quelqu'un pourrait l'implémenter.
TomG

demux n'est pas la même chose que décoder ... veuillez vérifier ceci
Flash Thunder

Réponses:


5

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!):

  • VLC
  • MJPEG
  • GStreamer

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:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
Oui, j'ai déjà essayé Gstreamer et cela fonctionne très bien lors de la diffusion sur un PC, mais cela ne fonctionne pas bien avec des logiciels tiers comme le Synology DiskStation. Il semble que GStreamer réutilise simplement le flux h264 et entoure un protocole de streaming sans le décoder, ce qui est une excellente solution mais malheureusement pour un petit nombre de cas d'utilisation. Si je veux voir le flux sur un appareil Android, je devrais développer ma propre application pour cela. MJPEG est beaucoup plus largement pris en charge, et je suis sûr que Raspivid peut être modifié pour ignorer l'encodage inutile en laissant cela à VLC ou à peu près. Merci pour l'astuce de toute façon
Louis Somers

1
J'ai aussi un Synology mais pas essayé GStreamer dessus (le mien n'est pas assez puissant je pense). À propos d'Android, vous pouvez également utiliser GStreamer! Je l'utilise pour mon projet et ça marche bien :)!
Val

Problème avec gstreamer, il n'inclut pas l'intervalle de temps dans les données de trame et son inutilisable en tant que récepteur (même avec l'option ajoutée !!) :( Il y a des scripts de mod disponibles pour le tuyau via mais j'ai trouvé que recevoir gstreamer pour bombarder VLC sortait souvent. Il y a 6 mois, quand je cherchais à faire de la vidéosurveillance, mais cela n'a jamais fonctionné de manière fiable :(
Piotr Kula

@Val true, il existe un SDK pour Android, mais pas beaucoup de joueurs prêts à l'emploi dans le magasin de stockage qui prennent en charge des pipelines comme gst-launch-1.0 -v hôte tcpclientsrc = port 11.22.33.44 = 1234! gdpdepay! rtph264depay! avdec_h264! vidéoconvert! sync autovideosink = faux. Pour iOS, il y en a encore moins disponibles. Le Synology est un excellent hub qui prend en charge la plupart des appareils grand public, peut effectuer la détection de mouvement, l'enregistrement et les notifications, tous prêts à l'emploi (et sans renoncer aux cartes SD).
Louis Somers

Utilisez-vous toujours cela comme ça? Il y a le nouveau pilote U4VL, mais toujours les mêmes problèmes de décalage avec le streaming h264 vers VLC
Piotr Kula

0

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:

Entre autres choses, il offre une interface Web à partir de laquelle il est possible de voir le flux vidéo de différentes manières et une page de contrôle permettant de contrôler entièrement les paramètres de la caméra lors de la diffusion avec n'importe quelle application Video4Linux.

Je n'ai pas encore essayé le lac pour le moment (puisque je ne veux pas gâcher ma configuration actuelle).


1
Je ne sais pas si c'était votre problème, mais si vous envoyez du trafic RTSP multicast via un routeur, assurez-vous que la surveillance IGMP est activée et assurez-vous que votre PC ne bloque pas les requêtes IGMP du routeur. Sinon, le routeur ne réalisera pas que votre PC essaie de recevoir les paquets, il ne les transmettra donc jamais.
Malvineous
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.