Mediamtx write in queue full

Bonjour, bonjour, c’est encore moi …

ma configuration :
raspberry ip 3b+ 1gb
stick 4g LTE ( 18 mbps en descente / 11.8 en momtée)
sd card 16 gb

Je construis un drone en 4g avec mission planner,python ,et pour le flux vidéo mediamtx, webrtc. Je suis au point ou la video passe en local , mais pas via le vpn. Le défaut indiqué est write in queue full.
Pensez vous que la raspberry est trop courte ou qu’il y a un autre probleme ?

Le défaut :
pascal@raspberrypi:~/mtx $ sudo systemctl status mediamtx.service

  • mediamtx.service - Launch MediaMTX after 1 minute
    Loaded: loaded (/etc/systemd/system/mediamtx.service; enabled; preset: enabled)
    Active: active (running) since Tue 2024-11-26 14:02:08 CET; 30min ago
    Main PID: 627 (mediamtx)
    Tasks: 12 (limit: 755)
    CPU: 33.106s
    CGroup: /system.slice/mediamtx.service
    |- 627 ./mediamtx mediamtx.yml
    `-2136 ffmpeg -f v4l2 -input_format h264 -video_size 640x480 -framerate 30 -use_wallclock_as_timestamps 1 -fflags +genpts -i /dev/video2 -c:v copy -f rtsp rtsp://localhost:8554/cam

nov 26 14:32:12 raspberrypi bash[2136]: [157B blob data]

11/26 14:32:16 WAR [WebRTC] [session 4d3d357d] write queue is full
nov 26 14:32:17 raspberrypi bash[2136]: [157B blob data]
nov 26 14:32:17 raspberrypi bash[627]: 2024/11/26 14:32:17 WAR [WebRTC] [session 4d3d357d] write queue is full
nov 26 14:32:18 raspberrypi bash[2136]: [157B blob data]
nov 26 14:32:18 raspberrypi bash[627]: 2024/11/26 14:32:18 WAR [WebRTC] [session 4d3d357d] write queue is full

le drone :

Une recherche Google donne un début de piste; tu atteint la limite de la bande passante réseau (sature).

Réduit le débit et le poids du stream, soit par la résolution et/ou la qualité.

Donc pour toi ce n’est pas un problème de matériel mais de bande passante.
Je ne vois pas bien comment l’augmenter avec un stick 4g … Ils sont tous dans les memes capacités
merci pour ta réponse.

C’est que tu as plusieurs choses qui peuvent influer sur ta capacité de transfert. Déjà, du sans-fils est sensible a l’état de l’environnement, peut importe la technologie. Après, tu as ton système, il y a t-il des application (comme apt en schédule) qui peut utiliser la bande réseau ? Est-ce qu’un service, mis à part la vidéo, utilise la bande passante ?


Ce qui te donne dans les ~2.5Mo/s down et ~1.5Mo/s en up

En plus, ton service peut limité volontairement certains type d’envoie.

Si le compte utilisé est seul utilisateur du compte, et qui ne passe pas par un autre appareil (pont mobile) alors ce sera tes vitesses max théorique.


Mais ton format est quand même faible, mais en h264. Je n’utilise pas ce format dans mes projets de stream, mais j’utilise des RPi Zero et il est plus simple de gérer du MJpeg. Faudrait savoir le débit généré. Avec du MJpeg je peut gérer 8 streams in/out facilement sur du 100MBps (~15Mo/s*), mais je préfère le 1Gbps (~150Mo/s*).

Alors tu devrais arriver à stream, mais idéalement, tu dois permettre une tolérance du débit varié (VBR et non CBR) et avoir un flux inférieur ~15% de la limite d’envoie (marge d’erreur et buffering)

En effectuant un codec copy du stream vidéo, tu exige de maintenir le format de la source (hardware), ce qui dans certain cas de figure est trop « rigide » pour bien maintenir le stream, ou change, de manière automatique, certaines valeurs pour s’ajuster.

En voulant s’ajuster, FFMpeg peut générer des effets non désiré, comme l’ajout de temps dans le stream et par effet augmentation du latency.

FFMpeg pour s’ajuster à un frame rate en direct peut avoir de « drole » de comportement. Il peut sembler bien travailler mais découper les frames de manière a ne pas refléter le temps réel (~5%) ou simplement garder l’ensemble des frames pour doubler le temps. au lieu de couper 60 en 2 pour 30fps, il prendra le 60 fps pour en faire 30 frames en 2 secondes.

Je parle de cela car ton problème est causé par un goulot d’étranglement; trop de données tente de passer par le même canal, l’effet d’entonnoir ( = > - - ).

Dans ton cas, ont peut déjà dire que ce n’est pas le CPU, l’erreur serait autre. Mais soit au niveau réseau, soit au niveau du disque.

Mais ton projet n’inclus aucune écriture sur disque, de plus, il vient d’un service « WebRTC ».

Ce service, ne connaissant pas ta configuration et les système impliqués, peut servir de 2 choses;

  • Communication de contrôle par interface Web : Contrôle ou « api » du service
  • Service de diffusion en protocole Web : Diffusion du stream

Si ce service, enregistre sur le disque le stream reçu, il peut;

  • Soit avoir un disque plein ou limité par un quota
  • Soit qu’il n’a pas les autorisations d’écriture conforme à son privilège

Après si c’est un problème réseau, qui est plus probable, tu dois déterminer si le problème est du;

  • Au capacité du serveur : Il ne peut gérer l’ensemble du flux reçu par manque de ressources (RAM, conflit de charge, mauvaise config logiciel,…)
  • Au capacité matériel : Limitation de la bande passante (cité plus haut)

Alors de la l’importance de connaitre la vitesse du flux réel émit par FFMpeg. Tu as déjà une bonne idée avec le KBps du stream quand tu te connect dessus.


* Valeur défini par calcul simpliste d’évaluation moyenne
** Selon la capacité de la source

merci pour ta réponse.

suivant ton raisonnement , je me suis mis sur un wifi plus rapide ( 50 mbs) , ça ne change rien.
write in queue reste full .
Je me demande si ce n’est pas la pi qui ne suit pas à compresser le flux.
Pour info, le flux porte aussi les données telemétrie et commande du drone mais ce doit etre leger.

Bah avec mon explication, tu dois comprendre qu’il existe un noeud dans le cheminement du flux qui bloque.

Bon j’ai refais une recherche avec ton message d’erreur et le nom du logiciel cette fois, et tu as la réponse en premier, qui plus, cette erreur serait documenté dans le README (toujours lire le README).

Il suffit de grossir la taille de la liste d’attente (queue).

merci, j’ai lu et je n’ai rien compris !
allez je vais m’appliquer …

bon j’ai porté le write in queue à 1024 au lieu de 512
baissé la qualité à 320x240 30 fps mais rien n’y fait !

Bon, je vais t’aider a y voir plus clair, voici le texte du README et je t’explique ce qui est dit.

Corrupted frames

In some scenarios, when publishing or reading from the server with RTSP, frames can get corrupted. This can be caused by multiple reasons:

  • the write queue of the server is too small and can’t keep up with the stream throughput. A solution consists in increasing its size:

writeQueueSize: 1024

Il informe que dans certain scénario, des frames peuvent être corrompu. Plusieurs raisons sont possibles.

  • La queue d’écriture est trop petite et ne peut tenir le débit, la solution consiste à l’augmenter;
    writeQueueSize: 1024
  • The stream throughput is too big and the stream can’t be transmitted correctly with the UDP transport protocol. UDP is more performant, faster and more efficient than TCP, but doesn’t have a retransmission mechanism, that is needed in case of streams that need a large bandwidth. A solution consists in switching to TCP:

protocols: [tcp]

In case the source is a camera:

paths: test: source: rtsp://… rtspTransport: tcp

  • Le flux est trop gros et ne peut pas être transmit correctement via le protocole. Malgré que le UDP soit plus performant par la vitesse que le TCP, il n’a pas des capacité de retransmission, qui est requis dans des flux à haut débit. La solution consiste à passer en TCP;
    protocols: [tcp]

    Dans le cas d’une source caméra le chemin serait`

paths:
  test:
    source: rtsp://..
    rtspTransport: tcp
  • The stream throughput is too big to be handled by the network between server and readers. Upgrade the network or decrease the stream bitrate by re-encoding it.

Le flux de sortie est trop gros et ne peut pas être maintenu par le réseau, le server ou le client. Augmenter la capacité réseau et/ou changer le Bitrate du flux par le réencodage


Comme tu vois, les points 2 et 3 de cette section du README parle de ce que je t’expliquait dans mes autres posts. Pour le point 1, c’est une option du logiciel. Dans le message source, l’utilisateur confirme que la valeur par défaut est sous évalué et doit être ajusté.

512 à 1024 c’est doubler l’attente, tu peux tester avec une valeur plus grande comme 2048 ou 4096, je crois. Tu pourras déjà déterminer si ça aide ou si c’est ton débit du flux (stream) qui est ton problème.

Le Wireless à 50Mbps c’est 2.5Mo/s ce qui devrais être suffisant. Alors passer en TCP et augmenter le Queue pourrais être la solution. Ta résolution est quand même faible, inutile de tester en 320x240, 720x480 donne de bon résultat.

Un format MJpeg a 720x480 à 30fps me donne un débit d’environ 15ko/secondes, bien en dessous des limitations. Le format H264 me donne dans les 700ko~1.2Mo/seconde .

merci pour ton aide .

J’ai bien augmenté le fichier à 1024
Je n’ose pas changer le protocole , j’ai peur de ne pas savoir revenir en arrière.
j’ai essayé de lancer la raspberry pi sur mon réseau wifi local et je ne crache pas … sauf que quand je veux lire la vidéo à partir de mon gsm par exemple à l’"adresse locale:8889/cam/ ", mediamtx.yml s’arrete.
Je devrais peut etre essayer une autre carte sim avec plus de bande passante ?
Pascal

Inutile d’arriver là. Le problème est purement du au logiciel utilisé de mon avis.

Lors d’une connexion, si le logiciel plante, c’est que lui même a un problème. Il n’a peut-être pas assez de ressource (tu allou bien que 96M à la vidéo, pour lui laisser le reste ?)

En bas de 96M, le CPU peut rencontrer des problèmes, plus haut, tu handicaps ta disponibilité de mémoire

Le format UDP est très dur, comparé au TCP à débug. Vu l’explication dans le README, ta solution semble au fait de passer en TCP.

Je ne comprend pas ta « peur » de passer en TCP, qui est un standard, et qu’il suffit de retirer les changements apporté à la config pour revenir en arrière (en UDP).

Donner plus de Queue aideras grandement, mais vu que je ne sais pas ou est la limite du logiciel, et de quel manière il l’utilise, vaut mieu l’augmenter petit par petit peux.

Si tu rencontre encore des problèmes, trouve une autre solution d’application.


Si ton objectif est uniquement de streamer de la vidéo, je te conseil de regarder du côté de FFServer et de FFMpeg version 3.40 (il est obsolete, mais ajoute ffmpeg dans le dossier ou tu exécute la commande pour lier le stream et il n’écrasera pas ta version actuel)). C’est la dernière version supportant le FFServer et c’est ce que j’utilise. Il est très configurable et marche sans problème. Il a la capacité de drop des frames et de s’ajuster dynamiquement. La configuration des caméra est plus facile et flexible.

L’autre solution, est d’installer « motion », qui est un système de vidéo surveillance puissant et efficace (et optimisé RPi).

Donc ma config protocole est :

Global settings → RTSP server

Enable publishing and reading streams with the RTSP protocol.

rtsp: yes

List of enabled RTSP transport protocols.

UDP is the most performant, but doesn’t work when there’s a NAT/firewall between

server and clients, and doesn’t support encryption.

UDP-multicast allows to save bandwidth when clients are all in the same LAN.

TCP is the most versatile, and does support encryption.

The handshake is always performed with TCP.

protocols: [udp, multicast, tcp]*

Encrypt handshakes and TCP streams with TLS (RTSPS).

Available values are « no », « strict », « optional ».

Je supprime udp et multicast ?

Pour paths :

paths:
cam:
runOnInit : ffmpeg -f v4l2 -input_format h264 -video_size 640x480 -framerate 30 -use_wallclock_as_timestamps 1 -fflags +genpts -i /dev/video2 -c:v copy -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH
runOnInitRestart: yes

example:

my_camera:

source: rtsp://my_camera

J’ajoute :
test:

  • source: rtsp://…*
  • rtspTransport: tcp*

Je t’invite a relire mon post au sujet de l’interprétation du README, tout est la.

HA HA!!! Même eu l’indique que ce n’est pas la meilleurs solution. Ta config via SIM est souvent basé NAT, alors Bingo, tu as trouvé le problème, il faut passer en TCP absolument, de plus le UDP n’est pas encrypté, ce que le TCP peut faire lui;

Et en passant…

Alors tu peux contacter le server, et quand il veu stream sur le UDP, tout plante, à cause du NAT. Confirmation du problème.

Tout tes soucis est ton désire de passer en UDP. Le seule serveur qui fait ça (et obligé) est Minecraft PE, et je peut te dire que c’est un bordel a gérer.

P.S. Il faudra apprendre à utiliser les outils pour bien formater tes messages, comme dans ton message précédent, mettre en « code » le texte du fichier de configuration, ça facilite la lecture et la compréhension de l’information.

Bonjour,

Encore une fois je tiens à m’excuser je ne suis pas programmeur , j’essaye juste de faire tourner ce logiciel .

Alors, aujourd’hui, j’ai modifié deux lignes dans mon service mediamtx.yml :

     ` protocols: [tcp]`          à la place de     ` protocols: [udp, multicast, tcp]`

 et j'ai ajouté :
                               paths:
                               test:
                               source: rtsp://localhost:$RTSP_PORT/$MTX_PATH
                               rtspTransport: tcp
 avant : 
              cam:
                runOnInit: ffmpeg -f v4l2 -input_format h264 -video_size 640x480 -framerate 30 - 
               use_wallclock_as_timestamps 1 -fflags +genpts -i /dev/video2 -c:v copy -f rtsp 
               rtsp://localhost:$RTSP_PORT/$MTX_PATH
               runOnInitRestart: yes

J’ai rebooté tout ça ,

Mais ça ne tourne plus : le message d’erreur est :

        `ERR: json: cannot unmarshal string into Go struct field alias.paths of type struct`

Tu ne respect pas la forme JSon du document. (tes valeurs $RTSP_PORT, je ne suis pas sur qui est accepté).

Vérifie la syntaxe de ton document.

on dirait je trouve ça sur stable learn.com :

2. Push Streaming

 paths:
  live:
    runOnInit: ffmpeg -re -i source.mp4 -c copy -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH
    runOnInitRestart: yes 

L’Url que tu me donne n’est pas valide.

Je crois qu’il faut mettre dans des "

Mais déjà la mise en forme générale ne respect pas la forme JSon standard (de leur fichier original), il manquerais des [ ] et des { } vu la présence de valeur en Array.

En tout cas, j’aurais appris une chose en t’aidant, ne jamais utiliser MediaMTX. :stuck_out_tongue:

bonjour,

le site est celui-ci : Complete MediaMTX Streaming Server Deployment Guide: From Basics to Production • Tech Explorer :rocket:

aujourd,hui je vais essayer les «  » , voir les tutos pour mediamtx et voir si ce n’est pas du coté du vpn qu’il y a un problème .
bon we

Bonsoir,

voilà, j’y suis arrivé !
Merci @levelKro pour son soutien et à son temps.

J’ai changé la PI . Je suis


passé à la pi 5 . J’ai tout rechargé depuis 0 et ça fonctionne

merci .