Trouver le goulot d’étranglement sur la latence RTMP de capture TV

J’essaie de diffuser localement une capture de télévision d’un ordinateur à un autre, mais ma latence est plus élevée que je ne le souhaite.

Ma configuration est une Geforce 970 de 12 Go, i5 x4 3.2ghz et une carte de capture Elgato HD60 Pro. Cette machine exécute une instance Ubuntu avec Nginx + RTMP ( https://github.com/arut/nginxrtmp-module ) installé.

Il est livré avec un logiciel de capture / diffusion en continu qui vous permet d’ajuster la bande passante + la résolution. Il est configuré pour diffuser au RTMP local à l’ rtmp://192.168.1.200/capture .

Sur ma machine récepsortingce, j’ai essayé d’utiliser VLC (réseau ouvert) et FFPLAY ( ffplay -fflags nobuffer rtmp://192.168.1.200/capture -loglevel verbose ).

Le FFPLAY a moins de latence que le VLC, ce qui semble logique compte nobuffer drapeau nobuffer . Cependant, il rest environ 2-3 secondes jusqu’à ce que je voie les mises à jour correctes.

  • Le temps de réponse sur l’aperçu de la capture est presque immédiat (environ 100 ms peut-être)
  • Le temps de réponse du stream FFPLAY est compris entre 2 et 3 secondes

J’imagine que cela signifie qu’il y a un goulot d’étranglement entre le serveur Elgato et le serveur RTMP OU entre le serveur RTMP et mon stream FFplay OU les deux.

Les choses que j’ai essayées:

  • Augmenter les Mbps du logiciel de capture entre 1.00 et 8.00
  • Diminuer la qualité de capture du plus haut au plus bas
  • Diminuer la résolution de capture de 1080, à 720, à la norme
  • Diminution du framerate de 60fps à 30fps
  • Utilisez FFPLAY au lieu de VLC

Note: Il n’y a pas d’options spéciales dans ma configuration RTMP NGINX. C’est une norme en live on et c’est à peu près tout.

Quelle est la meilleure approche pour diagnostiquer le problème? Je voudrais l’avoir <1s.

Merci!

Je suppose que le codage vidéo et le décodage vidéo introduisent le plus grand délai. Supposons votre compression en H.264 (AVC) – J’éteins les B-frames.

En ce qui concerne les diagnostics, je lance Wireshark sur la machine cliente. Assurez-vous que les horloges client et serveur sont synchronisées. Ensuite, je compare les horodatages du stream RTMP avec l’horloge du client. Cela devrait vous donner une idée du délai d’encodage. Le délai total moins l’encodage vous donne un délai de décodage. Vous pouvez probablement négliger la mise en mémoire tampon du réseau et le délai de transmission.

C’est un problème intéressant et l’indussortinge propose des solutions – par exemple, http://www.ineoquest.com/ .

Je pense que dans votre cas, le goulot est le traitement vidéo. Généralement, le codage vidéo du logiciel n’est pas si rapide. Si vous diminuez la qualité vidéo, le débit binary, etc., vous ajoutez plus de traitement et augmentez simplement le délai. Si vous avez besoin d’envoyer une vidéo pas trop loin de la source, utilisez simplement une interface vidéo comme HDMI. Il transmettra la vidéo comme il se passe (sans traitement) Si vous êtes vraiment intéressé par le streaming réseau, envisagez d’utiliser des encodeurs spéciaux, tels que PCI ou des périphériques externes. Ces périphériques ont des encodeurs vidéo matériels intégrés et n’utilisent pas de processeur pour le traitement vidéo. Habituellement, avec un encodeur matériel, le délai est inférieur à 1s, mais il est toujours vrai: “plus de traitement vidéo = plus de retard”