MPTS · TSDuck · PSI/SI






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.
Lorsque le mux parent a le statmux activé, chaque encodeur FFmpeg fonctionne en VBR plafonné : -b:v <avg> -minrate <min> -maxrate <max>.
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é).
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.
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.
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).
À 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é.
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.
--max-input-packets 4096 / --max-flushed-packets 4096 (FIFO interne ≈ 0,3 s @ 19 Mbps). --receive-buffer-size 16777216 (16 Mo socket UDP).
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)
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.
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é mux 38 Mbps
┌──────────────────────────────────────────────────────────────────┐
│███████████████████████
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
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.
┌─────────────────────────┐
│ Encodeur (NVDEC→NVENC) │ ← UDP satellite
STREAM │ /dev/shm/stream
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
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
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é.
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.
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.
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.
Les bits exacts par flux émis par le mux (compteurs côté émetteur) calibrent le mappage complexité→débit et maintiennent la stabilité.
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.
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.
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.
La sortie est un flux CBR exact au cap configuré. Trois couches le garantissent :
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.
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.
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.
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.
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.
La ligne pointillée en haut = cap configuré (plafond câble). Contenu + rembourrage null ensemble restent toujours en dessous.
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 rouges sur la timeline = débordement de file d'envoi (abandon). Zéro en régime stable ; rafales seulement au démarrage/inondation.
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.
Le survol affiche le débit par canal, QP et indice de qualité à cet instant (valeur historique, pas en direct).
Niveau de régulation du pool actuel (pool/(pool−trim)). >100% = surpression (remplissage du tampon), <100% = écrêtage.
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.
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.
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.
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é.
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é.
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
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.
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é.
Nous faisons du vrai multiplexage statistique — redistribution dynamique des bits sur des canaux VBR partageant un câble fixe, avec équilibrage de qualité.
Câble CBR à cap · tampon 1 s · allocation proportionnelle par flux · feedforward C1 · équilibrage qualité · pilote encodeur.
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).
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.
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.
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.
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 :::]
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).
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 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.