Jump to content

Streaming local via OBS + Nginx + VLC/ffplay


Recommended Posts

Bonjour,

Je précise que je ne suis pas du tout un pro dans le domaine qui n'est pas le mien. Mais j'essaye d'être force de propositions sur toute la partie IT de mon équipe.

Dans le cadre de mon travail, je cherche à mettre au point un démonstrateur de streaming vidéo sur un réseau local. Le but est d'étudier étudier la faisabilité technique d'une solution de remplacement à des boîtiers de streaming hardware tels que ceci https://www.epiphan.com/products/vgadvi-broadcaster/ et https://www.epiphan.com/wp-content/uploads/2014/07/epiphan-vga2ethernet-brochure.pdf (legacy).

Nous avons plusieurs boîtiers de ce type depuis quelques années mais leur fiabilité commence à nous décevoir, et le prix ne cesse d'augmenter (1200 € en 2015, 1600 € en 2018, 2000 € en 2021...).

Le but de ces boîtiers est de pouvoir avoir un affichage déporté de l'écran de divers appareils de mesure (qui disposent de sorties VGA), avec la latence la plus faible possible. La latence fournie par ces appareils Epiphan sont de l'ordre de 300 ms avec les anciens produits et 1 à 3 secondes avec les nouveaux (flux RTSP). La latence espérée est en-dessous de la seconde pour pouvoir travailler dans de bonnes conditions. Les consommateurs du flux seront toujours dans le même sous-réseau, et l'infrastructure réseau nous permet d'avoir plusieurs dizaines de flux à 2 ou 3 Mo/s sans congestion.

J'ai donc fait l'acquisition de quelques boîtiers d'acquisition VGA USB (~50 €), et je me suis mis gaiement à me documenter et expérimenter OBS et NGinx.

Ma machine de test (PC perso) dispose d'un i7 7700k bien O/C, d'une GTX 1080 et de 32 Go de RAM. De quoi être à l'aise avec ce que je lui demande.

Le streaming OBS est configuré pour utiliser l'encodage matériel du GPU (NVENC) à un débit entre 5500 kbps et 10000 kbps. Lorsque j'active le streaming, le CPU est chargé à 6 %, le GPU à 15 %, et je peux monitorer la charge sur le réseau (localhost) avec NetLimiter qui se situe entre 700 Ko/s et 1,2 Mo/s. Bref il y a de la marge partout et aucun bottleneck en vue.

Mon problème arrive quand je veux lire le stream, depuis ce même PC :

Que ça soit avec VLC ou ffplay, la lecture est catastrophique. La vidéo se contente d'avoir 1 ou 2 images toutes les 15 à 20 secondes, avec une latence compriss entre 10 et 30 secondes ! L'audio est à peu près correct (peu de coupures) mais avec ce même délai. Je vois en effet que VLC & ffplay ne vont pas chercher le flux en permanence. Quand je regarde leur activité réseau, ils se permettent de fluctuer quelques secondes entre 50 Ko/s et 900 Ko/s, et ils font des pauses de 1 à 3 secondes à zéro !

Via VLC j'ai désactivé le network-caching (0 ms), et avec ffplay j'ai utilisé ces paramètres :

ffplay -rtmp_buffer 0 -rtmp_live live rtmp://127.0.0.1:1935/stream/test

 

Que puis-je faire d'autre ? Comment se fait-il que la latence ne soit pas quasi-nulle entre le rendu d'OBS et le lecteur sur la même machine ?

Est-ce que c'est Nginx qui ne délivre pas toute la bande-passante demandée par le lecteur, ou ce sont les lecteurs qui sont incapable de faire mieux ?

 

Link to comment
Share on other sites

déjà faudrait faire un test sur une autre machine pour voir si le fait d'encoder avec la carte graphique ne gêne pas au décodage par la carte graphique (VLC et FFMPEG doivent utiliser l’accélération matériel par défaut)

ensuite il y a peut-être des paramètres à spécifier dans nginx pour ce genre de flux. je ne sais pas, je ne me suis pas trop penché sur la question. OBS n'est pas capable de streamer directement sur le réseau local?

Link to comment
Share on other sites

Je viens de tester avec un autre PC et je suis étonné du résultat. La latence est toujours présente dans le même ordre de grandeur, mais j'arrive à voir des bribes de vidéos de 1 ou 2 secondes au lieu d'avoir juste des images fixe.

Je ne comprends pas pourquoi la lecture sur le même PC poserait problème. Même si le lecteur utilise l'accélération matérielle, le GPU reste sous les 20% d'utilisation. Qui plus est, il reste sur une fréquence GPU "2D" de 607 MHz, il ne switche même pas sur 1200 ou 1900 MHz.

Dans les différents paramètres de nginx.conf que j'ai trouvé dans les différents tutos et topic sur le sujet, je n'ai pas trouvé grand chose. Les tutos sont plus souvent fait pour une application "live" et pas "stream", et bien que je ne saisisse pas la différence entre les 2, il semble que ça ne se comporte pas tout à fait pareil.

J'ai vraiment l'impression que ce sont les lecteurs qui ne prennent pas la peine de se fournir en permanence des données ou que le serveur nginx ne les mette pas à disposition en permanence.

OBS n'est effectivement pas capable de streamer en local, il ne possède pas de serveur RTMP. Il ne sert que de source du flux, c'est pour ça qu'un serveur comme Nginx est requis.

Link to comment
Share on other sites

et streamer via VLC (il me semble qu'il peut faire sreveur de flux media) ?
il y'a même peut-être une version serveur de VLC.

c'est vrai que c'est bizarre ce comportement. et je suis bien d'accord que ça "devrait" marcher en local mais au moins on a éliminé une possible cause.

Link to comment
Share on other sites

Hello, voilà où j'en suis avec vos excellentes suggestions :

  1.  VLC : Si VLC utilise bien l'accélération matérielle pour décoder du contenu, il semble impossible de l'utiliser pour transcoder un live. En tout cas c'est le CPU qui bosse, pas le GPU via nvenc. La qualité du live est excellente, mais avec un lag identique, du genre 10 secondes et des frame drop à gogo. (malgré un CPU utilisé à 30%, donc avec de la marge).
  2. Nvidia Gforce experience est un service réservé au streaming de jeux. Il semble exclusivement dédié au straming vers les plateformes (FB/Twitch/Youtube) et nécessite un compte en ligne. Il ne semble donc pas pouvoir fonctionner hors ligne en LAN uniquement. Vu la confidentialité des écrans (appareils de mesure dans un milieu industriel), j'écarte l'option.
  3. Shoutcast semble exclusivement fait pour de l'audio, et on n'en a pas du tout (vidéo uniquement).
  4. Il reste la piste de Icecast que je vais tester à présent.
    1. EDIT: En fait, malgré la mention de support vidéo sur la page d’accueil de Icecast ("Icecast is a streaming media (audio/video)") il semble ne posséder aucune fonctionnalité pour streamer autre chose que de l'audio.

Je précise aussi que mes sources vidéo sont vraiment très peu gourmandes en bande-passante : Les instruments de mesure ont des sorties vidéo VGA de 3 type seulement :

  • 640x480 px
  • 800x600 px
  • 1920x1080 px mais dont le contenu utile n'est que de 800x600 px, le reste étant une bordure noire.

10 à 15 images par secondes suffisent largement (avec l'actuelle solution on limite même à 5 FPS souvent pour économiser de la bande-passante), car ce qu'on visualise n'est pas de la vidéo mais des signaux comme sur un oscilloscope.

Maintenant, si on peut brancher 4 sources vidéos sur un même PC il y a 2 options : soit je crée 4 flux distincts, soit je crée un flux unique (avec OBS par exemple), dans lequel je divise le canva en 4 pour y incruster les 4 sources.

Edited by Nozalys
Link to comment
Share on other sites

Je suis un peu surpris car j'utilise OBS pour numériser des K7 VHS (avec un magnétoscope connecté au PC avec un adapteur RCA to USB) et je n'ai pas vu de drop.

Au passage, l'image résultat est dégueulasse comme sur l'original, vu avec nos résolutions/qualités de fou qu'on a aujourd'hui.

Link to comment
Share on other sites

il y a 4 minutes, Aloyse57 a dit :

Je suis un peu surpris car j'utilise OBS pour numériser des K7 VHS (avec un magnétoscope connecté au PC avec un adapteur RCA to USB) et je n'ai pas vu de drop.

Au passage, l'image résultat est dégueulasse comme sur l'original, vu avec nos résolutions/qualités de fou qu'on a aujourd'hui.

Mais tu utilise OBS en mode streaming (puis tu récupère le flux via un autre logiciel pour l'enregistrer dans un fichier), ou bien tu utilise OBS directement en mode record ? Parce que depuis la fenêtre d'OBS, il n'y a aucun lag ni drop par rapport à mes sources (je teste avec une webcam). Pour moi ça vient vraiment du côté serveur/client.

 

La prochaine fois que je retourne sur site, j'essaierais ma configuration OBS/Nginx/VLC sur un PC du boulot pour savoir déjà si c'est mon PC perso qui complique les choses ou pas.

Edited by Nozalys
Link to comment
Share on other sites

Il y a 4 heures, Nozalys a dit :

VLC : Si VLC utilise bien l'accélération matérielle pour décoder du contenu, il semble impossible de l'utiliser pour transcoder un live. En tout cas c'est le CPU qui bosse, pas le GPU via nvenc. La qualité du live est excellente, mais avec un lag identique, du genre 10 secondes et des frame drop à gogo. (malgré un CPU utilisé à 30%, donc avec de la marge).

as tu un cœur utilisé à fond ? car un (7700k oc à combien? il est bien stable ?) 4c8t peux vite être limite pour faire se genre de taff hein il faut pas regardé l'utilisation globale du cpu mais par coeur/thread

32go de ram à quelle fréquence ? en mode streaming la ram est bien sollicitée il faut qu'elle crache bien. Quel type de disque hdd ou ssd ? si ça se trouve ça fait du tampon sur un hdd qui sature ?

Le 20/10/2021 à 09:44, Nozalys a dit :

Via VLC j'ai désactivé le network-caching (0 ms),

pourquoi ? avec 5Hz tu peux mettre jusqu'à 200ms de cache et va permettre de lisser un peu les demandes réseaux

d'ailleurs j'y viens quel est ton réseau local ? contrôleur de domaine ? routeur avec firewall intégré ? ports ouvert ? DPI actif ?

regarder une vidéo locale peux très bien passer par le routeur quand même à moins de bien spécifier 127.0.0.1

tes frames drop et latence semble quand même lié à ton réseau local

pendant tes essais les epiphan tourne aussi ? le/les routeurs n'ont de lien surchargé qui délesterai le traffic sur un lien secondaire ?

Pour voir si c'est un problème réseau ou pc tu peux essayer de prendre le contrôle a distance via (anydesk-vnc ...) du pc qui à les vidéos de tes appareils puis tu actives l'encodage, la diffusion etc et vois ou ça bug

Link to comment
Share on other sites

Le 20/10/2021 à 09:44, Nozalys a dit :

Que puis-je faire d'autre ? Comment se fait-il que la latence ne soit pas quasi-nulle entre le rendu d'OBS et le lecteur sur la même machine ?

Ta commande pour supprimer le buffer ne conerne que le côté lecture.

Le protocole rtmp ne "sert" pas les données immédiatement il me semble. C'est pour le "rattrapage" pour les clients qui laguent.

https://obsproject.com/forum/threads/optimization-quality-vs-latency.140022/https://obsproject.com/forum/threads/optimization-quality-vs-latency.140022/Tu devrais trouver des paramètres dans OBS pour réduire la latence d'encodage et de transfert.

Vérifie peut-être aussi quel type d'encodage tu as utilisé, le codec peut être prévu ou paramétré en mode stockage, pas transport (pour le mode transport, on diminue la qualité mais on augmente le nombre de b-frames)

https://obsproject.com/forum/threads/optimization-quality-vs-latency.140022/

Link to comment
Share on other sites

  • 4 weeks later...

Bonsoir,

Après avoir fouillé un peu partout dans les options de OBS et sur des forums de nginx, je n'ai pas réussi à diminuer la latence de mon stream ni à améliorer sa qualité.

J'ai renvoyé mes boîtiers d'acquisition VGA USB, pourtant très bien pensés, mais inexploitable dans mon cas d'usage. Ma tentative de Proof of concept à échoué :pleure:.

 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...