×

⊳ Muxer

MPTS · TSDuck · PSI/SI

Multiplexeur MPTS & Statmux Hybride Adaptatif

Le mux Stream Manager assemble plusieurs flux SPTS en une sortie MPTS CBR unique (DVB/IPTV). Le Statmux Hybride Adaptatif combine VBR et multiplexage statistique.

1. Couche encodeur (FFmpeg par flux)

Lorsque le mux parent a le statmux activé, chaque encodeur FFmpeg fonctionne en VBR plafonné : -b:v <avg> -minrate <min> -maxrate <max>.

2. Couche mux (pipeline tsp TSDuck)

tsp -I null (∞ paquets NULL @ débit ligne) → -P merge tsp -I ip <flux> (superpose les vrais paquets) → -P continuity (supprime les alarmes de continuité).

3. Couche sortie (UDP)

Le plugin regulate émet exactement mux.bitrate bps sur le câble. Les entrées en retard → des paquets NULL comblent le vide. Les entrées en pointe → le régulateur ralentit.

Dimensionnement recommandé (Σ min / moy / max vs mux.bitrate)

La barre supérieure du mux affiche 3 sommes avec un état en couleur. Règles :

Σ avg ≤ 85 % mux.bitrate — somme des cibles moyennes sur tous les canaux plus l'audio. C'est le « budget » du mux. Les 15 % restants constituent la réserve statistique.

Σ max ≤ 160 % mux.bitrate — somme plafond des pics. Autorisé à dépasser la capacité (c'est le principe du statmux — les pics coïncident rarement).

Σ min ≤ 50 % mux.bitrate — somme du plancher encodeur. Un plancher sûr garantit que sur les scènes calmes l'encodeur ne tombe pas à un niveau trop bas.

Exemple : 4 canaux HD dans un mux DVB-T à 19 Mbps

Budget disponible après PSI/SI/EIT : ~18,5 Mbps. Σ avg = 4 × 4,0 = 16 Mbps (86 % — orange limite, à abaisser). Σ max = 4 × 6,0 = 24 Mbps (129 % — acceptable).

Diagnostics et alarmes

À partir de ≥ 10 alarmes en 60s, une notification flash apparaît dans l'UI Mux recommandant une réduction du débit. Le recul automatique N'EST PAS implémenté.

-P bitrate_monitor --periodic 60 --min/max ±5% — alarme si le débit réel s'écarte de ±5 % de la cible. Signifie que regulate est bloqué ou que l'entrée est absente.

-P continuity — surveille les compteurs de continuité TS. Journalise un avertissement à chaque rupture (sur-souscription, crash FFmpeg, gigue NIC).

-P pcrverify --jitter-max 500000 — DVB autorise une gigue PCR ≤ 500 µs. Alarme = pcradjust ne peut pas suivre ou la source a un PCR cassé.

Glitches et leurs causes

Coïncidence GOP — tous les encodeurs émettent des I-frames simultanément, coïncidence de pointe. Correctif : décalage GOP (déjà activé pour le statmux).

Perte de signal d'entrée — un seul canal devient noir, le mux continue (grâce à la base -I null). Durée ~3-8 s pour le redémarrage FFmpeg.

Sur-souscription (pics soutenus > capacité) — blocages/bégaiement audio ~50-200 ms. Correctif : baisser le débit moyen du flux de 5-10 % ou retirer un canal.

Dérive PCR — bégaiement du décodeur toutes les quelques secondes. Correctif : pcradjust dans le pipeline (déjà présent), surveiller les alarmes pcrverify.

Underrun VBV du décodeur — le décodeur perd la synchronisation et se resynchronise (~2-3 s). Correctif : bufsize encodeur = 2 × maxrate (déjà), baisser maxrate.

Paramètres du pipeline tsp (mux_worker.ex)

--max-input-packets 4096 / --max-flushed-packets 4096 (FIFO interne ≈ 0,3 s @ 19 Mbps). --receive-buffer-size 16777216 (16 Mo socket UDP).

Calcul empirique de capacité (CLT)

Le badge de la barre supérieure `📐 rec X.XM` indique la capacité mux recommandée dérivée du théorème de la limite centrale. La somme de canaux VBR indépendants converge vers une distribution normale.

Couleur du badge : 🟢 vert = cap ≥ 99,7% rec (conservateur) · 🟡 orange = entre 99% et 99,7% · 🔴 rouge = cap < 99% (sous-provisionné)

z-score par cible de couverture : 90% z=1,28 · 95% z=1,65 · 99% z=2,33 · 99,7% z=3,00 (défaut) · 99,99% z=3,72 (grade diffusion)

σ_eff = σ_total × statmux_factor (statmux_factor = 0,7 quand le Statmux est ON, sinon 1,0)

Valeurs recommandées par canal (HD H.264)

Canal HD 1080p25 : avg = 4000-5000 kbps, min = avg × 0,75 (~3000-3750), max = avg × 1,5 (~6000-7500). L'UI remplit automatiquement min/max.

Statmux Hybride Adaptatif

Le Statmux Hybride Adaptatif est un mécanisme d'exécution qui transfère la capacité inutilisée des flux principaux (protégés, VBR complet) vers les flux équilibrés (sacrificiels).

Capacité — comment le débit est divisé

Capacité mux 38 Mbps

┌──────────────────────────────────────────────────────────────────┐

│███████████████████████

Gain pratique (10 flux × 3 Mbps avg, 4 Mbps max)

Sans Statmux Hybride Adaptatif, vous devez dimensionner le mux pour le Σ max du pire cas. Avec le Statmux Hybride Adaptatif, vous dimensionnez autour de Σ avg + marge statistique.

CBR pur (encodeur fixe)

VBR sans Statmux

Statmux Hybride Adaptatif ON

Exclusivité URL ↔ Statmux

La substitution d'entrée URL personnalisée et le Statmux sont mutuellement exclusifs. Avec le Statmux activé, le transcodeur équilibré s'appuie sur le pipeline HLS local.

Pipeline (encodeur → transcodeur équilibré → mux ffmpeg → tsp)

┌─────────────────────────┐

│ Encodeur (NVDEC→NVENC) │ ← UDP satellite

STREAM │ /dev/shm/stream

Dimensionner le VBR min/avg/max principal pour le statmux

Le gain statistique ne se produit que lorsque les encodeurs ont une large plage VBR — lorsque max ≈ avg, l'encodeur est effectivement en CBR et le statmux n'a rien à redistribuer.

Exemple concret — mux 38 Mbps, 10 HD principaux + 2 équilibrés :

Ancien (CBR figé) : min=2000 avg=3000 max=4000

Σmax

Plage recommandée par flux principal :

• min ≈ avg × 0,5 (l'encodeur peut descendre sur les scènes calmes)

• avg = débit cible nominal

Conseils & dépannage

Au moins 1 flux équilibré — sans lui, le routeur Hybride Adaptatif n'a rien à écraser pendant les pointes, donc le gain = 0

Les chaînes musique et info sont les meilleurs candidats — tolérance de 90 %+ à la réduction de débit

Suivre via les entrées de log `[balance-router]` — affiche `core_max`, `remaining`, transitions de niveau pour chaque tick de 1 s

Si `core_max > capacity` (avertissement CORE OVERPEAK dans le log), réduire le nombre de flux principaux ou abaisser le maxrate de l'encodeur

Flux de travail opérateur

Ajouter des flux au mux (l'attribution des canaux reste manuelle)

Activer le Statmux dans l'en-tête du mux (puce jaune). Quand activé, tous les encodeurs passent en VBR et redémarrent

Marquer les flux sacrificiels via la case à cocher orange côté droit — typiquement les canaux musique/info où la réduction du débit est invisible

Terminé. Le routeur Hybride Adaptatif lit une prédiction HLS à 6 segments depuis les flux principaux toutes les 1 s et échange atomiquement le niveau de flux équilibré.

Documentation StatMux

Plusieurs canaux à débit variable partagent un flux de transport fixe (MPTS). Les bits sont réalloués dynamiquement par la complexité du contenu.

Classe : statmux à rétroaction en boucle fermée avec anticipation C1 (feedforward) sur encodeurs VBR — principe statmux diffusion, adapté au IPTV.

Architecture & flux de données

Architecture diagram

UDP multicast SSM, par canal

Encodeurs

complexité source

Boucle de retour

propre ligne / flux

allocateur (Σ ≤ pool)

tampon

rembourrage null → CBR

Câble CBR à cap

anticiper une scène complexe avant la chute

câble mesuré — calibration

débit cible

Chaque canal transite sur sa propre ligne jusqu'au mux (encodeur séparé + connexion loopback), où tous fusionnent en un MPTS vers le câble.

Cerveau : feedback + anticipation C1

L'allocateur combine deux signaux — une prédiction depuis la complexité source (avant) et le câble mesuré (arrière). Cela donne un contrôle robuste.

C1 mesure la complexité du contenu au décodeur — ce qui devance la sortie encodeur par la latence du pipeline. La complexité relative conduit à la redistribution.

Câble mesuré (feedback)

Les bits exacts par flux émis par le mux (compteurs côté émetteur) calibrent le mappage complexité→débit et maintiennent la stabilité.

Délivrabilité

La créance d'un flux est soutenue par ce que l'encodeur produit réellement (× headroom de pointe). Un canal facile ne peut pas accaparer la bande passante.

Qualité équilibrée

L'objectif n'est pas un débit égal mais une qualité égale — une pression continue déplace les bits des canaux haute qualité (QP bas) vers les canaux complexes.

Redistribution prédictive

Quand C1 signale une chute d'un canal, sa bande passante est cédée aux autres dans le même tick — ils montent avant que la chute ne commence.

Pool = cap N − surcharge (PSI/EIT) − audio − réserve (slider). Mesuré sur le câble, maximum fenêtré contre les rafales.

Budget par flux = budget global × poids / Σpoids, serrage [min_bps, max_bps], recalculé tous les 10 ms.

Allocation pool proportionnelle par demande, limitée à [min, max] depuis le profil vidéo ; la bande passante libre va aux flux demandeurs.

Cible encodeur = alloc / calibration (EMA mesurée/cible par flux) ; envoyée avec un seuil (Δ≥3%/1s) et une limite de variation.

Le servo de maintien de tampon garde le niveau de file à ~1 s (bande), protection d'urgence sur surcharge ; le rembourrage null complète le reste jusqu'au cap.

CBR câble : tampon + rembourrage null + cadençage

La sortie est un flux CBR exact au cap configuré. Trois couches le garantissent :

Tampon permanent ~1 s

La file d'envoi maintient un niveau permanent de ~1 s de fil qui absorbe les chutes GOP sous la seconde (entre I-frames). Vérifié sur enregistrement : 0,5–1 s absorbe 88–91 % des chutes.

Rembourrage null

Quand le contenu est sous le cap, la différence est comblée par des paquets null MPEG-TS (PID 0x1FFF). Le fil atteint ainsi TOUJOURS le cap — conforme DVB.

Cadençage exact

L'émission est cadencée exactement au cap (busy-spin ABSTIME) ; un serrage de dette 12 ms prévient les rafales de rattrapage après une brève pause → pas de gigue PCR, pas de dépassement cap.

Graphique de sortie (rivière)

Un graphique empilé en direct du vrai câble — chaque bande est un canal, transitant régulièrement depuis la droite. Les données sont mesurées côté émetteur.

Bandes colorées

Chaque canal a une couleur stable ; l'épaisseur = son débit instantané. La surcharge (PSI/EIT) est grise en bas, le rembourrage null est blanc pointillé en haut.

Ligne Cap / Max

La ligne pointillée en haut = cap configuré (plafond câble). Contenu + rembourrage null ensemble restent toujours en dessous.

Bande null

La bande blanche pointillée en haut = rembourrage null (capacité libre). Plus elle est fine, plus le câble est plein ; elle disparaît à la demande.

Marques d'abandons

Marques rouges sur la timeline = débordement de file d'envoi (abandon). Zéro en régime stable ; rafales seulement au démarrage/inondation.

Plage (30s–30m)

Les boutons changent la fenêtre temporelle instantanément (côté client), celui actif a un fond gris. Le graphique accumule 30 min de données.

Info-bulle

Le survol affiche le débit par canal, QP et indice de qualité à cet instant (valeur historique, pas en direct).

cap %

Niveau de régulation du pool actuel (pool/(pool−trim)). >100% = surpression (remplissage du tampon), <100% = écrêtage.

Réserve (slider)

Bande de tolérance au-dessus du cap — combien garder en réserve null. 0 = remplir exactement N ; positif = réserve plus grande (plus sûr) ; négatif = dépassement.

Tampon (abandons)

L'en-tête affiche l'utilisation % de la file d'envoi et les abandons cumulatifs. Le bouton « effacer les abandons » réinitialise le compteur.

GOP

Longueur GOP commune pour tous les canaux dans le mux (verrouillée dans les profils vidéo au démarrage). L'échelonnement temporel répartit les I-frames dans le temps.

VBV

Taille du tampon VBV de l'encodeur (ms). Plus petit aplatit les I-frames (bon pour les canaux action), plus grand donne un I-frame plus détaillé.

Cartes de flux & états

Chaque canal dans le mux a une carte avec le nom, PNR, débit actuel et cible, et l'état :

En cours — le canal encode et transite vers le câble.

Démarrage — l'encodeur monte en puissance / se stabilise.

gris + estompé = arrêt/erreur et case à cocher OFF (intentionnellement désactivé — pas d'alarme)

Erreur — entrée perdue / encodeur planté.

Tables PSI/SI (comment le mux les construit)

StatMux génère l'ensemble complet des tables MPEG-TS / DVB obligatoires directement dans le mux NIF — pas d'inserteur SI externe. Les tables sont uniformément cadencées dans le flux pour qu'un décodeur acquière rapidement la PSI/SI après recalage.

Table

PID

Intervalle

Objet / source

EIT ↔ EPG : intégration complète

L'EIT (Event Information Table, PID 0x12) n'est pas statique — il est entièrement câblé au système EPG de l'application. L'opérateur sélectionne un service EPG par canal.

Dimensionnement des canaux (min / avg / max)

min = plancher bas (scène statique). Recommandé avg × 0,5–0,75. Suffisamment bas pour économiser sur le contenu calme au profit des autres.

avg = niveau cible. Σ avg de tous les canaux ≈ pool vidéo (cap − surcharge − audio).

max = plafond (marge VBR pour les pics/coupes). Recommandé avg × 1,5. Ne pas limiter à avg — le VBR a besoin de marge pour les pics.

Exemples (avg) : SD 1,5–2,5M · HD 2,5–4M · FHD 4–6M · UHD 12–18M. Pour statmux, garder un écart raisonnable afin que le pool puisse être redistribué.

Relation avec les statmux de diffusion

Nous faisons du vrai multiplexage statistique — redistribution dynamique des bits sur des canaux VBR partageant un câble fixe, avec équilibrage de qualité.

Ce que nous avons

Câble CBR à cap · tampon 1 s · allocation proportionnelle par flux · feedforward C1 · équilibrage qualité · pilote encodeur.

Notre différence

Un statmux de diffusion utilise l'estimation débit-distorsion de l'encodeur (coût exact de trame, l'encodeur est un esclave de l'allocateur).

Dépannage

Symptôme

Cause / solution

Pics null / lacunes (5–7M) dans le graphique

Chutes de contenu — soit GOP entre I-frames (absorbé par le tampon 1 s) soit un blocage collectif de contenu (géré par redistribution). L'anticipation C1 a considérablement réduit ces cas.

Abandons > 0 en augmentation

File d'envoi en débordement — contenu au-dessus du cap. Vérifier la réserve (slider), l'utilisation et que l'allocateur n'est pas bloqué (tick actif). Les rafales au démarrage sont normales.

Un canal reste à bas débit / QP élevé

Soit contenu statique (correct — il libère de la bande passante) soit un max trop bas dans le profil. Vérifier min/avg/max et la complexité réelle de la source.

Le graphique bégaie / le bord gauche s'efface

Côté client — rafraîchissement forcé (Ctrl+Shift+R) pour le nouveau bundle JS. Les données transitent par push incrémental, axe = plage sélectionnée.

Le cap % / tampon ne change pas après modification

Re-rendu LiveView — rafraîchissement forcé. Les valeurs se mettent à jour une fois par seconde via un assign suivi.

Architecture (de bout en bout)

SAT UDP SSM ─┐
             ├─ gst_encoder.py(K1)  CBR ─ TCP127 ─┐        Complexité ZMQ
   (par      ├─ gst_encoder.py(K2)  CBR ─ TCP127 ─┤            ▲   │
   chan)     └─ gst_encoder.py(Kn)  CBR ─ TCP127 ─┤            │   ▼
                                                  ▼     BalanceRouter
                                   ┌─────── NIF StatMux ───────┐  │ set_bitrate
                                   │ anneau par entrée (supprim-ancien) │◄─┘
                                   │ drainage 2-pass (A prio, V)  │
                                   │ allocateur: w=cmplx×max    │
                                   │ ×headroom% (curseur 78-90) │
                                   │ exclusion périmée (>2s)     │
                                   │ pad NULL -> cap CBR fil     │
                                   │ passage PCR                 │
                                   └────────────┬──────────────┘
                                                ▼
                                   MPTS  UDP multicast (CBR cap)

gst_encoder.py par flux : entrée UDP SSM SAT → nvh264enc rc-mode=cbr. Le débit est piloté par BalanceRouter via set_bitrate.

Anneau par entrée (loopback TCP depuis l'encodeur), drain en 2 passes (priorité audio, vidéo complète), allocateur proportionnel, rembourrage NULL.

Un MPTS (PAT/PMT/SDT généré par NIF) → UDP multicast sur le VLAN de sortie. Le câble est strictement CBR à mux.bitrate (NULL statique).

Ligne 1 : ⚠ (problèmes de validation) · PNR · nom dans un cadre (couleur = état).

Ligne 2+ : min·avg·max kbps · complexité prédite Δ basse/moyenne/haute/pic · ENTRÉE PERDUE · ⚙URL · Mbps encodeur · SID · service_type.

Couleur du nom = état du flux :

Mbps

37 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ <= cap 37,0 Mbit (rouge, plafond CBR câble)

· · · · · · · · · · · · · · · ·

Ligne 'cap' rouge : plafond CBR câble (mux.bitrate) — NULL remplit jusqu'ici.

Ligne orange 'headroom N%': = cap × curseur headroom / 100. L'encodeur set_bitrate cible ici. Se déplace avec le curseur.

Zone grise avec points noirs entre contenu et cap = remplissage NULL (réserve inutilisée). Plus de points = plus de réserve.

Cliquer sur la bande de couleur d'un canal → développe automatiquement la carte de ce canal en dessous.

Programme

MuxEitAdapter lit les événements depuis le système EPG par service, construit les sections DVB EIT (nom, heure, durée, description).

L'EIT est injecté directement dans le mux NIF, uniformément DANS l'espace null (1 paquet / N sortie + p/f périodiquement) — remplaçant le null sans rafale.

Table 0x4E — l'événement en cours + suivant. Injecté toutes les ≤2 s pour une actualité « maintenant/suivant » instantanée sur le décodeur.

Le mux régénère périodiquement l'EIT .bin depuis l'EPG (~15 s) — un changement de programme EPG atteint le câble sans redémarrage.

Tables 0x50/0x51 — le programme complet heures/jours à l'avance (segments). Répartis uniformément dans le flux.

Jauge différentielle (au-dessus du graphique)

Indicateur du flux réel vs cap. Centre = cap (0). Marqueur gauche (vert) = réserve (Σ contenu sous cap) ; droite (rouge) = dépassement cap.

-5 Mbps CAP 37000 kbps +5 Mbps

[#### vert = réserve ####│::: rouge = dépassement cap :::]

Slider headroom (78–90 %, défaut 85)

Plus bas (→78) : plus de réserve NULL, plus sûr, utilisation du cap moins tendue.

Plus haut (→90) : utilisation du cap plus tendue, moins de NULL.

⚠ ≥88 % : le slider vire au jaune — proche du plafond de gel du débordement du ring. Limite dure 78–90 (impossible d'atteindre 100 — protection).

Asymétrie : baisser ajoute fiablement de la réserve ; monter est limité par le plafond max_bps par flux (l'allocateur ne poussera pas un canal au-delà).

Contrôle quelle fraction du cap les encodeurs ciblent : cible encodeur = budget × headroom% / 100 (ligne orange dans le graphique).

Perte de signal / défaillance de canal (isolation)

Un canal échoue (crash encodeur / perte de signal) ⇒ le mux continue à fonctionner, les autres canaux ne sont pas affectés, le câble maintient le cap (NULL remplit).

PCR / synchronisation

PCR et PES PTS/DTS sont transmis depuis l'encodeur (domaine d'horloge unique ⇒ cohérent, sans dérive). Gigue PCR résiduelle ~typique.

CAT — accès conditionnel (uniquement lors du brouillage / ECM).

EIT — informations d'événement (EPG) — depuis le système EPG, voir ci-dessous.

NIT — table d'information réseau (fréquence/modulation pour les récepteurs DVB-T/S).

PAT — table d'association de programmes. Liste tous les PNR et leurs PMT PID.

PMT — table de carte de programme. Liste les PIDs audio/vidéo/sous-titres pour chaque service.

SDT — table de description des services. Noms des chaînes (nom_service, fournisseur_service).

TDT/TOT — heure/date. Horloge système nécessaire pour l'affichage EPG sur les décodeurs.