MPTS Migrate Perfect Streamer Toolkit v1.1 — migración de la identidad MPTS

Parte del Perfect Streamer Toolkithttps://pstreamer.tv

Captura la identidad DVB SI/PSI de un flujo MPEG-TS multiprograma (MPTS) en funcionamiento y la reproduce en una instancia de Perfect Streamer (PSS) del mismo host. Como resultado, los receptores de los abonados (STB / TV) siguen funcionando sin volver a explorar los canales después de una migración o de una conmutación al equipo de reserva.

La herramienta forma parte del paquete pstreamer y, tras la instalación, se encuentra en /opt/pss/tools/mpts_migrate — no es necesario instalar nada por separado.

Requisitos previos

Antes de ejecutar la utilidad, compruebe que:

  • PSS está en ejecución en el mismo host (o en un host accesible mediante --pss-base). La utilidad busca pss en /proc y lee pss.json para obtener el puerto de administración (43971 si la configuración no lo contiene).

  • El MPTS de origen está accesible si se prevé una captura (modos 1, 2, save+apply): la URL indicada como argumento posicional <input> debe entregar un flujo MPEG-TS. Para multicast UDP, IGMP / el cortafuegos deben permitir la recepción; para los archivos, la ruta debe existir.

  • El MPTS de destino ya está configurado en PSS: la utilidad no crea flujos nuevos. El objeto MPTS y al menos tantos alimentadores SPTS como servicios haya en el inventario deben existir de antemano. Los servicios sin alimentador libre se muestran en el diálogo y pueden omitirse.

  • La API HTTP de administración está disponible en localhost para leer /data/stream (se utiliza durante la verificación) y escribir /config/stream (aplicación).

Qué se migra

Todos los identificadores visibles para el receptor, a nivel de flujo de transporte y de servicio:

  • Flujo de transporte: TSID, ONID, network ID, network name, provider name (se aplica como sdt-provider-name común a todo el múltiplex si todos los servicios de origen tienen el mismo valor), descriptor de entrega (parámetros de emisión terrestre / por cable / por satélite), versiones de PAT/SDT/NIT

  • Por servicio: service_id, pmt_pid, pcr_pid, service_type, nombre del servicio, número lógico de canal (LCN), indicador free-CA, indicadores EIT-present / EIT-schedule

  • Flujos elementales: los PID (se aplica un identity remap — véase Limitaciones), tipos de flujo, etiquetas de idioma

  • Acceso condicional: descriptores CA a nivel de programa y de ES

Los nombres de servicio / proveedor en codificaciones DVB distintas de ASCII (por ejemplo, ISO-8859-5 para el cirílico) se decodifican a UTF-8 automáticamente.

Para cada servicio, el remapeo de PID de ES se construye como pares de identidad (mpegts-pid-oldmpegts-pid-new) para cada PID de PCR / vídeo / audio / teletexto / datos, por lo que la salida multiplexada resultante conserva los PID originales byte-exact. Los receptores antiguos que almacenan en caché la PMT tras la primera exploración siguen funcionando sin reconfiguración.

En PSS 2.0.0.193 y posteriores, el plan habilita además, en la entrada del multiplexor del MPTS de destino, el modo nativo de conservación de los PID originales (Automatic PID mapping desactivado) y fija para cada servicio el número de orden de programa capturado en la PAT (program order) — el orden de programas en antena sobrevive a la migración. La compatibilidad se detecta automáticamente a partir de la configuración del streamer de destino; en versiones anteriores estas claves no se envían (la utilidad imprime una advertencia), los pares de identidad son el único mecanismo que fija los PID y el orden de programas en la PAT no se conserva.

Casos de uso

  • Failover: conmutación de los decodificadores del MPTS principal al de reserva conservando los canales en el lado del receptor

  • Migración de hardware: traslado de un múltiplex en funcionamiento de un host PSS a otro sin instrucciones para los espectadores

  • Instantánea antes / después de la actualización: captura del múltiplex antes de actualizar PSS y nueva aplicación posterior para garantizar un SI/PSI idéntico bit a bit

  • Edición manual y nueva aplicación: captura, edición de migrate.json (renombrar servicios, cambiar los LCN, ajustar service_type) y nueva aplicación

  • Comprobación en dry-run: impresión de cada HTTP POST que se enviaría, sin afectar a PSS

Inicio rápido

# Capture from a live stream and apply to local PSS in one run
mpts_migrate udp://239.1.1.1:1234

# Capture, save to migrate.json and apply
mpts_migrate -s udp://239.1.1.1:1234

# Capture only — write to file, do not apply
mpts_migrate -o backup.json udp://239.1.1.1:1234

# Apply a previously saved JSON
mpts_migrate -i backup.json

# No arguments — load ./migrate.json and apply
mpts_migrate

# Preview what apply would do, without changes
mpts_migrate -i backup.json --dry-run

Flujo de trabajo

  1. Captura — la utilidad abre el flujo, analiza PAT / PMT / SDT / NIT / EIT durante -t segundos (30 por defecto) y construye el inventario; se mide la tasa de bits total del flujo.

  2. (Opcional) Guardado — con -s o -o el inventario se escribe en JSON para su reutilización posterior.

  3. Búsqueda de PSS — detecta el PSS en ejecución explorando /proc y lee pss.json para obtener el puerto de administración (43971 si la configuración no lo contiene); --pss-base http://host:port omite la detección automática.

  4. Confirmación de la correspondencia — un diálogo interactivo pregunta cómo asociar cada servicio capturado con un alimentador SPTS existente; --non-interactive acepta las propuestas y termina si hay conflicto; --target-mpts <id> omite la petición de selección del MPTS.

  5. Reanudación automática de los alimentadores — para cada SPTS / muxer-output asociado, la utilidad envía {"pause":false} si el alimentador estaba en pausa, de modo que el multiplexor reciba datos realmente tras la aplicación.

  6. Ajuste automático de la tasa de bits — si captured_bitrate × (1 + headroom%) supera el mpegts-output-bitrate del MPTS de destino, la utilidad eleva ese límite en PSS con un único POST (con redondeo al alza al múltiplo de 1000 kbps más próximo). Se desactiva con --no-bitrate-adjust.

  7. Planificación — compara el inventario con el árbol /config/stream actual de PSS y prepara peticiones HTTP POST solo para los campos que difieren. El remapeo de PID de ES se genera como pares de identidad (mpegts-pid-oldmpegts-pid-new) para que la salida multiplexada conserve sin cambios cada PID original — incluidos PCR, vídeo, audio, teletexto, SCTE-35 y DSM-CC. En PSS 2.0.0.193 y posteriores, el plan habilita además el modo de conservación de los PID originales en la entrada del multiplexor de destino y fija el orden de programas en la PAT (véase Qué se migra).

  8. Aplicación — envía las peticiones POST planificadas y a continuación conmuta el MPTS pause/unpause para que PSS relea la configuración; con --dry-run el plan solo se imprime.

  9. Verificación (activada por defecto, incluso si el plan está vacío) — captura el MPTS resultante a través de una de las salidas UDP de PSS y lo compara con el destino; las discrepancias críticas (TSID, ONID, service_id, name, type, LCN) → código de salida 5.

Volver a ejecutar toda la cadena es idempotente: la segunda pasada informa no changes needed si PSS ya coincide con el inventario, y la verificación lo confirma con una captura nueva.

Opciones de la CLI

Selección de modo

Opción

Descripción

Predeterminado

-f, --file <path>

Ruta al JSON de migración (se usa como importación por defecto en ausencia de -i y como destino de guardado con -s)

./migrate.json

-s, --save

Guardar el inventario capturado en el archivo de migración (se combina con una entrada de flujo; la aplicación se realiza igualmente)

-o, --output <file>

Solo captura: escritura en archivo, sin aplicar

-i, --input <file>

Solo aplicación: carga del archivo, sin captura

Captura

Opción

Descripción

Predeterminado

-t, --time <sec>

Duración máxima de la captura

30

-b, --bitrate <Mbps>

Sugerencia de tasa de bits del TS para la regulación de ritmo en modo archivo

38.8

Apply / Verify

Opción

Descripción

Predeterminado

--target-mpts <id>

Omitir la petición de selección del MPTS; aplicar a este flujo id en PSS

--non-interactive

Aceptar automáticamente las propuestas del diálogo; terminar si hay conflicto

--dry-run

Imprimir el plan de POST sin enviar nada

--pss-base <url>

Anular la detección automática de PSS (por ejemplo, http://host:8808)

automático

--no-verify

Omitir la captura y el diff posteriores a la aplicación

verificación activada

--verify-time <s>

Ventana de captura para la verificación

10

--no-bitrate-adjust

No elevar mpegts-output-bitrate en el MPTS de destino

elevación activada

--bitrate-headroom <pct>

Margen de tasa de bits por encima del valor medido al ajustar

15

Varios

Opción

Descripción

-v, --verbose

Registro detallado (cada HTTP POST y cada rama del diálogo)

-h, --help

Mostrar la ayuda y salir

Archivo de migración (migrate.json)

JSON legible por humanos con format_version: 1. La ubicación por defecto es ./migrate.json; se anula con -f. Ejemplo de estructura:

{
  "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,
      "program_order": 1,
      "free_ca_mode": false,
      "elementary_streams": [
        { "pid": 256, "stream_type": 27, "language": "rus" }
      ]
    }
  ]
}

El archivo puede editarse antes de una nueva aplicación: renombrar servicios, cambiar los LCN, cambiar service_type, ajustar network_namempts_migrate -i migrate.json envía solo los campos modificados.

Conexión con PSS

  • Detección automática: exploración de /proc/<pid>/comm en busca de pss, lectura de su archivo --config y toma de web-server.bind-port (43971 si la clave no está presente).

  • Manualmente: --pss-base http://host:port omite por completo la detección automática. Resulta útil para un PSS remoto o cuando --dry-run debe generar el plan sin un PSS activo.

  • La API REST de administración no requiere autenticación en localhost.

Verificación

Si --no-verify no se especifica (comportamiento por defecto), tras aplicar el plan la utilidad:

  1. Busca una salida UDP hacia localhost en el MPTS de destino o añade una temporalmente en 127.0.0.1:<auto> (con la marca added by mpts_migrate for verification).

  2. Captura el MPTS en vivo a través de esa salida durante --verify-time segundos (10 por defecto).

  3. Compara el inventario capturado con el destino:

    • Discrepancia crítica (TSID, ONID, network name, service_id, name, type, LCN) → código de salida 5.

    • Discrepancia leve (PMT PID, número de ES, nombre del proveedor, orden de programas en la PAT) → se muestra como advertencia, código de salida 0.

  4. Si el MPTS de destino está sobrecargado (tasa de bits de salida ≥ el mpegts-output-bitrate configurado), se imprime WARNING: target MPTS is overloaded — véase Bitrate adjust más abajo.

Dry-run

--dry-run imprime cada petición HTTP que la utilidad enviaría (ruta y cuerpo JSON), pero no envía ninguna. Resulta útil para:

  • Revisar el plan con el operador antes de confirmarlo.

  • Generar conjuntos de cambios reproducibles en CI / gestión de cambios.

  • Trabajar cuando PSS no está accesible (combinar con --pss-base http://host:port).

El dry-run no ejecuta la verificación.

Bitrate adjust

Por defecto, si captured_bitrate × (1 + headroom%) supera el mpegts-output-bitrate del MPTS de destino, la utilidad eleva ese límite en PSS antes de aplicar los cambios de SI/PSI. Sin un margen suficiente, un MPTS sobrecargado pierde los datos de baja prioridad — los síntomas típicos son cortes de audio en los servicios de radio y errores CRC intermitentes en la EIT. Se desactiva con --no-bitrate-adjust; el margen se regula con --bitrate-headroom <pct> (15 por defecto).

Códigos de salida

Código

Significado

0

Éxito — la aplicación y (si está activada) la verificación han finalizado sin incidencias. También lo devuelve un --dry-run correcto.

1

Error de argumentos / de archivo / de detección

2

No se ha encontrado ninguna PAT en el origen — la entrada no es un MPEG-TS válido o la ventana de captura es demasiado corta; también se devuelve cuando el operador ha rechazado la confirmación de la correspondencia o ha salido del diálogo (aplicación abortada)

3

Una o varias peticiones HTTP POST de la aplicación han fallado

4

La aplicación se ha completado, pero el MPTS de destino no ha vuelto al estado Running

5

La verificación ha fallado — el flujo capturado difiere del destino en campos críticos

Limitaciones y escollos

  • PSS debe disponer de antemano del MPTS de destino y de los alimentadores: la utilidad no crea flujos nuevos. El MPTS de destino y al menos tantos alimentadores SPTS como servicios haya en el inventario deben existir de antemano; los servicios sin alimentador libre se omiten en el diálogo.

  • El MPTS de origen debe estar accesible durante la captura (modos 1, 2, save+apply): la URL indicada como argumento posicional <input> debe entregar un flujo MPEG-TS; para multicast UDP, IGMP / el cortafuegos deben permitirlo.

  • El remapeo de PID de ES se aplica automáticamente: para cada servicio se genera un remapeo de identidad (mpegts-pid-oldmpegts-pid-new) para cada PID de PCR/vídeo/audio/teletexto/datos, de modo que la salida multiplexada conserve los PID originales byte-exact. La disposición de la PMT permanece estable de una migración a otra — incluso los receptores antiguos (STB anteriores a 2015, Samsung anteriores a la serie H, LG anteriores a WebOS 3.0) que almacenan los PID en caché no requieren una nueva exploración.

  • El descriptor de entrega debe corresponder al portador real para los receptores que se resintonizan mediante la NIT (DVB-T/T2/C/S). Un bloque delivery que no coincida puede llevar al receptor a una frecuencia incorrecta.

  • La coherencia de los LCN entre el MPTS principal y el de reserva es crítica para el failover — si difieren, las posiciones de los canales en la lista del receptor se desplazarán tras la conmutación.

  • El provider name en PSS es común a todo el múltiplex (un único sdt-provider-name por muxer-input del MPTS). La utilidad lo aplica automáticamente si todos los servicios capturados tienen el mismo valor; si distintos servicios llevan valores de provider_name diferentes, se imprime una advertencia y el campo queda intacto — la decisión corresponde al operador.

  • No es una herramienta de configuración de PSS: mpts_migrate solo toca los campos de identidad SI/PSI, el indicador pause de cada alimentador, (opcionalmente) mpegts-output-bitrate y, en PSS 2.0.0.193 y posteriores, las claves del modo de conservación de PID y del orden de programas. No configura codificadores, entradas, cifrado, programaciones ni similares.

  • En PSS anteriores a 2.0.0.193 no se admiten el modo de conservación de los PID originales del multiplexor ni el orden de programas en la PAT: la utilidad imprime una advertencia, los PID se fijan únicamente mediante los pares de identidad y el orden de programas tras la migración puede diferir del original.

Diagnóstico

Síntoma

Causa probable / solución

Error: no PAT seen in stream

el origen no es MPEG-TS, IGMP/el cortafuegos bloquea el multicast o -t es demasiado corto

Error: cannot reach PSS

utilizar --pss-base http://host:port para omitir la detección automática

La aplicación se ha completado, pero el MPTS sigue en pausa

revisar el registro de PSS; volver a ejecutar con -v para ver el plan completo de POST

La verificación indica una discrepancia crítica

comparar el destino y el flujo capturado en JSON; normalmente un alimentador se ha asociado por error al servicio equivocado en el diálogo

WARNING: target MPTS is overloaded

elevar mpegts-output-bitrate en PSS o usar --bitrate-headroom <higher %>; sin margen se corrompen el audio de los servicios de radio y las tablas PSI