MPTS Migrate Perfect Streamer Toolkit v1.0 — migration d’identité MPTS¶
Partie du Perfect Streamer Toolkit — https://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 cherchepssdans/procet litpss.jsonpour récupérer le port admin (43971par 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-namemux-wide si tous les services sources partagent une même valeur), descripteur de delivery (paramètres terrestres / câble / satellite), versions PAT/SDT/NITPar service :
service_id,pmt_pid,pcr_pid,service_type, nom du service, LCN, indicateur free-CA, indicateurs EIT-present / EIT-scheduleFlux é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-old ≡ mpegts-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 deservice_type), réapplicationVé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¶
Capture — l’outil ouvre le flux, parse PAT / PMT / SDT / NIT / EIT pendant
-tsecondes (30 par défaut) et construit l’inventaire ; le bitrate total est mesuré.(Optionnel) Sauvegarde — avec
-sou-o, l’inventaire est enregistré en JSON pour réutilisation ultérieure.Découverte de PSS — détecte un PSS en cours d’exécution via un scan de
/procet litpss.jsonpour obtenir le port admin (par défaut43971) ;--pss-base http://host:portcourt-circuite l’auto-discovery.Confirmation du mappage — une boîte de dialogue interactive demande comment associer chaque service capturé à un feeder SPTS existant ;
--non-interactiveaccepte les suggestions et abandonne en cas de conflit ;--target-mpts <id>saute la sélection du MPTS.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.Auto-ajustement du bitrate — si
captured_bitrate × (1 + headroom%)dépassempegts-output-bitratedu 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.Planification — compare l’inventaire à l’arborescence
/config/streamactuelle 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-old≡mpegts-pid-new) pour que la sortie multiplexée conserve chaque PID source inchangé — y compris PCR, video, audio, teletext, SCTE-35, DSM-CC.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é.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 |
|---|---|---|
|
Chemin du JSON de migration (import par défaut sans |
|
|
Sauvegarder l’inventaire capturé dans le fichier de migration (combinable avec une entrée flux ; l’apply est tout de même exécuté) |
— |
|
Capture seule : écriture dans un fichier, sans apply |
— |
|
Apply uniquement : chargement du fichier, sans capture |
— |
Capture¶
Option |
Description |
Par défaut |
|---|---|---|
|
Durée maximale de capture |
|
|
Indication de bitrate TS pour le pacing en mode fichier |
|
Apply / Verify¶
Option |
Description |
Par défaut |
|---|---|---|
|
Ignorer la sélection du MPTS ; appliquer à cet stream id sur le PSS |
— |
|
Accepter automatiquement les propositions du dialogue ; abandonner en cas de conflit |
— |
|
Afficher le plan des POSTs, sans rien envoyer |
— |
|
Remplacer la découverte automatique du PSS (ex. |
automatique |
|
Ignorer la capture post-apply et le diff |
verify activé |
|
Fenêtre de capture pour la vérification |
|
|
Ne pas augmenter |
ajustement activé |
|
Marge de bitrate au-dessus de la valeur mesurée lors de l’ajustement |
|
Divers¶
Option |
Description |
|---|---|
|
Journal détaillé (chaque POST HTTP et branche du dialogue) |
|
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_name — mpts_migrate -i migrate.json n’enverra que les champs modifiés.
Connexion à PSS¶
Auto-discovery : scanner
/proc/<pid>/commà la recherche depss, lire son fichier--configet prendreweb-server.bind-port(par défaut43971).Manuel :
--pss-base http://host:portcontourne entièrement l’auto-discovery. Utile pour un PSS distant ou lorsque--dry-rundoit 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 :
Cherche une sortie UDP sur localhost sur le MPTS cible, ou en ajoute temporairement une sur
127.0.0.1:<auto>annotéeadded by mpts_migrate for verification.Capture le MPTS en direct via cette sortie pendant
--verify-timesecondes (10 par défaut).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.
Si le MPTS cible est surchargé (bitrate de sortie ≥
mpegts-output-bitrateconfiguré),WARNING: target MPTS is overloadedest 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 |
|---|---|
|
Succès — l’apply et (si activée) la vérification se sont bien déroulés. Renvoyé aussi par un |
|
Erreur d’arguments / de fichier / de détection |
|
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 |
|
Un ou plusieurs POST HTTP de l’apply ont échoué |
|
L’apply s’est déroulé mais le MPTS cible n’est pas revenu à l’état Running |
|
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-old≡mpegts-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
deliverynon 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-namesur 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 valeursprovider_namediffé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_migratene touche qu’aux champs d’identité SI/PSI, au flagpausepar feeder et (optionnellement) àmpegts-output-bitrate. Encoders, inputs, chiffrement, planification, etc. — il ne les configure pas.
Diagnostic¶
Symptôme |
Cause probable / solution |
|---|---|
|
la source n’est pas du MPEG-TS, IGMP/pare-feu bloque le multicast ou |
|
utiliser |
L’apply s’est déroulé, mais le MPTS reste en pause |
vérifier le log de PSS ; relancer avec |
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 |
|
augmenter |