MPTS Migrate Perfect Streamer Toolkit v1.0 — migration d’identité MPTS

Partie du Perfect Streamer Toolkithttps://pstreamer.tv

Capture l’identité DVB SI/PSI d’un flux MPEG-TS multi-programmes (MPTS) en fonctionnement et la reproduit sur une instance Perfect Streamer (PSS) hébergée sur le même hôte. Résultat : les récepteurs des utilisateurs (STB / TV) continuent à fonctionner sans rebalayage des chaînes après une migration ou un basculement.

Prérequis

Avant de lancer l’outil, vérifiez que :

  • PSS fonctionne sur le même hôte (ou un hôte accessible via --pss-base). L’outil cherche pss dans /proc et lit pss.json pour récupérer le port admin (43971 par défaut).

  • Source MPTS accessible, si une capture est prévue (modes 1, 2, save+apply) : l’URL passée en argument positionnel <input> doit fournir un flux MPEG-TS. Pour UDP multicast — IGMP / pare-feu doivent autoriser la réception ; pour les fichiers — le chemin doit exister.

  • MPTS cible déjà configuré dans PSS : l’utilitaire ne crée pas de nouveaux streams. Un objet MPTS et au moins autant de feeders SPTS que de services dans l’inventaire doivent exister au préalable. Les services sans feeder disponible sont affichés dans la boîte de dialogue et peuvent être ignorés.

  • L’API HTTP admin est ouverte sur localhost — pour lire /data/stream (utilisé par verify) et écrire dans /config/stream (apply).

Ce qui est migré

Tous les identifiants visibles par le récepteur, au niveau du flux de transport et des services :

  • Transport stream : TSID, ONID, network ID, network name, provider name (appliqué comme sdt-provider-name mux-wide si tous les services sources partagent une même valeur), descripteur de delivery (paramètres terrestres / câble / satellite), versions PAT/SDT/NIT

  • Par service : service_id, pmt_pid, pcr_pid, service_type, nom du service, LCN, indicateur free-CA, indicateurs EIT-present / EIT-schedule

  • Flux élémentaires : PID (identity remap appliqué — voir Limitations), types de flux, tags de langue

  • Accès conditionnel : descripteurs CA au niveau du programme et de l’ES

Les noms de services et de fournisseurs dans des encodages DVB non ASCII (par exemple ISO-8859-5 pour le cyrillique) sont décodés en UTF-8 automatiquement.

Le remap ES PID par service est construit comme paires identité (mpegts-pid-oldmpegts-pid-new) pour chaque PCR / video / audio / teletext / data PID, de sorte que la sortie multiplexée résultante conserve les PID sources byte-exact. Les récepteurs legacy qui mettent le PMT en cache après le premier balayage continuent à fonctionner sans reconfiguration.

Cas d’usage

  • Failover : bascule des décodeurs du MPTS principal vers le secours, en conservant les chaînes côté récepteur

  • Migration matérielle : déplacement d’un multiplex en service d’un hôte PSS à un autre sans instructions pour les téléspectateurs

  • Snapshot pré/post-mise à jour : capturer le multiplex avant la montée en version de PSS, puis réappliquer après pour garantir des SI/PSI bit-identiques

  • Édition manuelle et réapplication : capture, édition de migrate.json (renommage des services, changement de LCN, ajustement de service_type), réapplication

  • Vérification dry-run : affichage de chaque POST HTTP qui serait envoyé, sans toucher au PSS

Démarrage rapide

# Захват из live-потока и применение к локальному PSS за один запуск
mpts_migrate udp://239.1.1.1:1234

# Захват, сохранение в migrate.json и применение
mpts_migrate -s udp://239.1.1.1:1234

# Только захват — запись в файл, без применения
mpts_migrate -o backup.json udp://239.1.1.1:1234

# Применение ранее сохранённого JSON
mpts_migrate -i backup.json

# Без аргументов — загрузка ./migrate.json и применение
mpts_migrate

# Просмотр того, что сделает apply, без изменений
mpts_migrate -i backup.json --dry-run

Flux de travail

  1. Capture — l’outil ouvre le flux, parse PAT / PMT / SDT / NIT / EIT pendant -t secondes (30 par défaut) et construit l’inventaire ; le bitrate total est mesuré.

  2. (Optionnel) Sauvegarde — avec -s ou -o, l’inventaire est enregistré en JSON pour réutilisation ultérieure.

  3. Découverte de PSS — détecte un PSS en cours d’exécution via un scan de /proc et lit pss.json pour obtenir le port admin (par défaut 43971) ; --pss-base http://host:port court-circuite l’auto-discovery.

  4. Confirmation du mappage — une boîte de dialogue interactive demande comment associer chaque service capturé à un feeder SPTS existant ; --non-interactive accepte les suggestions et abandonne en cas de conflit ; --target-mpts <id> saute la sélection du MPTS.

  5. Auto-unpause des feeders — pour chaque SPTS/muxer-output mis en correspondance, l’outil envoie {"pause":false} s’il était en pause, afin que le multiplexeur reçoive bien les données après l’apply.

  6. Auto-ajustement du bitrate — si captured_bitrate × (1 + headroom%) dépasse mpegts-output-bitrate du MPTS cible, l’utilitaire relève cette limite sur PSS via un seul POST (arrondi au multiple supérieur de 1000 kbps). Désactivable via --no-bitrate-adjust.

  7. Planification — compare l’inventaire à l’arborescence /config/stream actuelle de PSS, prépare des HTTP POSTs uniquement pour les champs qui diffèrent. Le remap ES PID est généré comme paires identité (mpegts-pid-oldmpegts-pid-new) pour que la sortie multiplexée conserve chaque PID source inchangé — y compris PCR, video, audio, teletext, SCTE-35, DSM-CC.

  8. Apply — envoie les POST prévus puis bascule pause/unpause du MPTS pour que PSS recharge la configuration ; en --dry-run, le plan est uniquement affiché.

  9. Verify (activé par défaut, même si le plan est vide) — capture le MPTS résultant via une des sorties UDP de PSS et le compare à la cible ; les divergences critiques (TSID, ONID, service_id, name, type, LCN) → exit 5.

Relancer l’ensemble du pipeline est idempotent : la deuxième exécution renvoie no changes needed si PSS correspond déjà à l’inventaire, et verify le confirme par une nouvelle capture.

Options CLI

Sélection du mode

Option

Description

Par défaut

-f, --file <path>

Chemin du JSON de migration (import par défaut sans -i et cible de sauvegarde avec -s)

./migrate.json

-s, --save

Sauvegarder l’inventaire capturé dans le fichier de migration (combinable avec une entrée flux ; l’apply est tout de même exécuté)

-o, --output <file>

Capture seule : écriture dans un fichier, sans apply

-i, --input <file>

Apply uniquement : chargement du fichier, sans capture

Capture

Option

Description

Par défaut

-t, --time <sec>

Durée maximale de capture

30

-b, --bitrate <Mbps>

Indication de bitrate TS pour le pacing en mode fichier

38.8

Apply / Verify

Option

Description

Par défaut

--target-mpts <id>

Ignorer la sélection du MPTS ; appliquer à cet stream id sur le PSS

--non-interactive

Accepter automatiquement les propositions du dialogue ; abandonner en cas de conflit

--dry-run

Afficher le plan des POSTs, sans rien envoyer

--pss-base <url>

Remplacer la découverte automatique du PSS (ex. http://host:43971)

automatique

--no-verify

Ignorer la capture post-apply et le diff

verify activé

--verify-time <s>

Fenêtre de capture pour la vérification

10

--no-bitrate-adjust

Ne pas augmenter mpegts-output-bitrate sur le MPTS cible

ajustement activé

--bitrate-headroom <pct>

Marge de bitrate au-dessus de la valeur mesurée lors de l’ajustement

15

Divers

Option

Description

-v, --verbose

Journal détaillé (chaque POST HTTP et branche du dialogue)

-h, --help

Afficher l’aide et quitter

Fichier de migration (migrate.json)

JSON lisible par un humain avec format_version: 1. Emplacement par défaut ./migrate.json ; redéfinissable via -f. Exemple de structure :

{
  "format_version": 1,
  "tool": "mpts_migrate",
  "capture": {
    "source": "udp://239.1.1.1:1234",
    "captured_at_utc": "2026-04-30T08:15:00Z",
    "duration_s": 8.2,
    "packets": 109344
  },
  "transport_stream": {
    "transport_stream_id": 1234,
    "original_network_id": 8442,
    "network_name": "Operator",
    "delivery": { "type": "terrestrial", "frequency_khz": 522000 }
  },
  "services": [
    {
      "service_id": 1, "pmt_pid": 256, "pcr_pid": 256,
      "service_type": 1, "service_name": "Channel 1",
      "provider_name": "MyProvider", "logical_channel_number": 101,
      "free_ca_mode": false,
      "elementary_streams": [
        { "pid": 256, "stream_type": 27, "language": "rus" }
      ]
    }
  ]
}

Le fichier peut être édité avant un nouvel apply : renommer les services, modifier le LCN, basculer service_type, ajuster network_namempts_migrate -i migrate.json n’enverra que les champs modifiés.

Connexion à PSS

  • Auto-discovery : scanner /proc/<pid>/comm à la recherche de pss, lire son fichier --config et prendre web-server.bind-port (par défaut 43971).

  • Manuel : --pss-base http://host:port contourne entièrement l’auto-discovery. Utile pour un PSS distant ou lorsque --dry-run doit produire un plan sans PSS actif.

  • L’API REST admin ne requiert pas d’authentification sur localhost.

Vérification

Si --no-verify n’est pas spécifié (par défaut), après application du plan l’utilitaire :

  1. Cherche une sortie UDP sur localhost sur le MPTS cible, ou en ajoute temporairement une sur 127.0.0.1:<auto> annotée added by mpts_migrate for verification.

  2. Capture le MPTS en direct via cette sortie pendant --verify-time secondes (10 par défaut).

  3. Compare l’inventaire capturé à la cible : - Divergence critique (TSID, ONID, service_id, name, type, LCN) → code de sortie 5. - Divergence douce (PMT PID, PCR PID, ES PID) → affichée comme warning, code de sortie 0.

  4. Si le MPTS cible est surchargé (bitrate de sortie ≥ mpegts-output-bitrate configuré), WARNING: target MPTS is overloaded est affiché — voir Bitrate adjust plus bas.

Dry-run

--dry-run affiche chaque requête HTTP que l’outil enverrait (chemin, corps JSON) sans rien envoyer. Utile pour :

  • Revue du plan avec l’opérateur avant le commit.

  • Génération d’ensembles de modifications reproductibles en CI / change-management.

  • Travail avec un PSS inaccessible (combiner avec --pss-base http://host:port).

Le dry-run n’exécute pas la vérification.

Bitrate adjust

Par défaut, si captured_bitrate × (1 + headroom%) dépasse mpegts-output-bitrate du MPTS cible, l’utilitaire relève cette limite sur PSS avant d’appliquer les changements SI/PSI. Sans réserve suffisante, un MPTS surchargé perd les données de basse priorité — symptômes typiques : perte d’audio sur les services radio, erreurs CRC EIT intermittentes. Désactivable via --no-bitrate-adjust ; la marge se règle via --bitrate-headroom <pct> (par défaut 15).

Codes de sortie

Code

Valeur

0

Succès — l’apply et (si activée) la vérification se sont bien déroulés. Renvoyé aussi par un --dry-run réussi.

1

Erreur d’arguments / de fichier / de détection

2

Aucune PAT détectée dans la source — l’entrée n’est pas un MPEG-TS valide ou la fenêtre de capture est trop courte

3

Un ou plusieurs POST HTTP de l’apply ont échoué

4

L’apply s’est déroulé mais le MPTS cible n’est pas revenu à l’état Running

5

La vérification a échoué — le flux capturé diffère de la cible sur des champs critiques

Limitations et pièges

  • PSS doit déjà héberger le MPTS cible et les feeders : l’utilitaire ne crée pas de nouveaux streams. Le MPTS cible et au moins autant de feeders SPTS que de services dans l’inventaire doivent exister au préalable ; les services sans feeder disponible sont ignorés dans la boîte de dialogue.

  • La source MPTS doit être accessible lors de la capture (modes 1, 2, save+apply) : l’URL passée en argument positionnel <input> doit fournir un flux MPEG-TS ; pour UDP multicast, IGMP / pare-feu doivent autoriser la réception.

  • Le remap ES PID est appliqué automatiquement : un remap identité par service (mpegts-pid-oldmpegts-pid-new) est généré pour chaque PCR/video/audio/teletext/data PID afin que la sortie multiplexée conserve les PID sources byte-exact. La disposition PMT reste stable entre migrations — même les récepteurs legacy (STB pré-2015, Samsung pré-série H, LG pré-WebOS 3.0) qui mettent les PID en cache n’ont pas besoin de rebalayer.

  • Le descripteur de delivery doit correspondre au porteur réel pour les récepteurs qui se reconfigurent via NIT (DVB-T/T2/C/S). Un bloc delivery non concordant peut diriger le récepteur vers une mauvaise fréquence.

  • Cohérence LCN entre MPTS principal et de secours essentielle pour le failover — si elle diffère, les positions des chaînes dans la liste du récepteur sont décalées après bascule.

  • Provider name sur PSS — commun à tout le multiplex (un seul sdt-provider-name sur le muxer-input MPTS). L’utilitaire l’applique automatiquement si tous les services capturés partagent une même valeur ; si différents services ont des valeurs provider_name différentes, un warning est imprimé et le champ reste intact — la décision revient à l’opérateur.

  • Pas un outil de configuration de PSS lui-même : mpts_migrate ne touche qu’aux champs d’identité SI/PSI, au flag pause par feeder et (optionnellement) à mpegts-output-bitrate. Encoders, inputs, chiffrement, planification, etc. — il ne les configure pas.

Diagnostic

Symptôme

Cause probable / solution

Error: no PAT seen in stream

la source n’est pas du MPEG-TS, IGMP/pare-feu bloque le multicast ou -t est trop court

Error: cannot reach PSS

utiliser --pss-base http://host:port pour contourner la découverte automatique

L’apply s’est déroulé, mais le MPTS reste en pause

vérifier le log de PSS ; relancer avec -v pour voir le plan complet des POSTs

La vérification signale un écart critique

comparer goal et capture dans le JSON ; généralement, un feeder est par erreur affecté au mauvais service dans le dialogue

WARNING: target MPTS is overloaded

augmenter mpegts-output-bitrate sur PSS ou --bitrate-headroom <higher %> ; sans marge, l’audio des services radio et les tables PSI se corrompent