MPTS Migrate Perfect Streamer Toolkit v1.0 — миграция идентичности MPTS

Часть Perfect Streamer Toolkithttps://pstreamer.tv

Захватывает идентичность DVB SI/PSI работающего многопрограммного MPEG-TS-потока (MPTS) и воспроизводит её на экземпляре Perfect Streamer (PSS) на том же хосте. Результат: пользовательские приёмники (STB / TV) продолжают работать без повторного сканирования каналов после миграции или переключения на резерв.

Предусловия

Перед запуском утилиты убедитесь, что:

  • PSS работает на том же хосте (или на хосте, доступном через --pss-base). Утилита ищет pss в /proc и читает pss.json, чтобы получить admin-порт (по умолчанию 43971).

  • Источник MPTS доступен, если планируется захват (режимы 1, 2, save+apply): URL, переданный позиционным аргументом <input>, должен отдавать MPEG-TS-поток. Для UDP multicast нужно, чтобы IGMP / firewall разрешали приём; для файлов — путь должен существовать.

  • Целевой MPTS уже настроен в PSS: утилита не создаёт новые потоки. Объект MPTS и хотя бы столько SPTS-фидеров, сколько сервисов в инвентаре, должны существовать заранее. Сервисы без свободного фидера показываются в диалоге и могут быть пропущены.

  • HTTP admin API открыт на localhost для чтения /data/stream (используется при verify) и записи /config/stream (apply).

Что мигрируется

Все идентификаторы, видимые приёмником, на уровне транспортного потока и сервисов:

  • Транспортный поток: TSID, ONID, network ID, network name, provider name (применяется как mux-wide sdt-provider-name, если все исходные сервисы делят одно значение), descriptor доставки (параметры наземного / кабельного / спутникового вещания), версии PAT/SDT/NIT

  • На сервис: service_id, pmt_pid, pcr_pid, service_type, имя сервиса, логический номер канала (LCN), флаг free-CA, флаги EIT-present / EIT-schedule

  • Элементарные потоки: PID-ы (применяется identity remap — см. Ограничения), типы потоков, языковые теги

  • Условный доступ: CA-дескрипторы на уровне программы и ES

Имена сервисов / провайдеров в DVB-кодировках, отличных от ASCII (например, ISO-8859-5 для кириллицы), декодируются в UTF-8 автоматически.

Per-service ES PID remap строится как identity-пары (mpegts-pid-oldmpegts-pid-new) для каждого PCR / video / audio / teletext / data PID, поэтому в результирующем мультиплексированном выводе исходные PID-ы сохраняются byte-exact. Старые приёмники, кеширующие PMT после первого сканирования, продолжают работать без перенастройки.

Сценарии использования

  • Failover: переключение декодеров с основного MPTS на резервный с сохранением каналов на стороне приёмника

  • Аппаратная миграция: переезд работающего мультиплекса с одного PSS-хоста на другой без инструкций для зрителей

  • Снимок до / после обновления: захват мультиплекса перед апгрейдом PSS, повторное применение после, чтобы гарантировать бит-идентичный SI/PSI

  • Ручная правка и повторное применение: захват, правка migrate.json (переименование сервисов, смена LCN, корректировка service_type), повторное применение

  • Dry-run-проверка: вывод каждого HTTP POST, который был бы отправлен, без воздействия на PSS

Быстрый старт

# Захват из 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

Рабочий процесс

  1. Захват — утилита открывает поток, парсит PAT / PMT / SDT / NIT / EIT в течение -t секунд (по умолчанию 30) и строит инвентарь; измеряется суммарный битрейт потока.

  2. (Опционально) Сохранение — с -s или -o инвентарь записывается в JSON для повторного использования.

  3. Поиск PSS — обнаруживает работающий PSS через скан /proc, читает pss.json для получения admin-порта (по умолчанию 43971); --pss-base http://host:port обходит автообнаружение.

  4. Подтверждение маппинга — интерактивный диалог спрашивает, как сопоставить каждый захваченный сервис с существующим SPTS-фидером; --non-interactive принимает предложения и завершает работу при конфликте; --target-mpts <id> пропускает запрос выбора MPTS.

  5. Авто-снятие паузы с фидеров — для каждого сопоставленного SPTS / muxer-output утилита посылает {"pause":false}, если фидер был на паузе, чтобы мультиплексор реально получал данные после apply.

  6. Авто-настройка битрейта — если captured_bitrate × (1 + headroom%) превышает mpegts-output-bitrate целевого MPTS, утилита поднимает этот лимит на PSS одним POST (округлённым вверх до ближайших 1000 kbps). Отключается через --no-bitrate-adjust.

  7. Планирование — сравнивает инвентарь с текущим деревом /config/stream на PSS, готовит HTTP POSTs только для отличающихся полей. ES PID remap генерируется как identity-пары (mpegts-pid-oldmpegts-pid-new), чтобы мультиплексированный вывод сохранял каждый исходный PID без изменений — включая PCR, video, audio, teletext, SCTE-35, DSM-CC.

  8. Применение — отправляет запланированные POSTs, затем переключает MPTS pause/unpause, чтобы PSS перечитал конфигурацию; при --dry-run план только печатается.

  9. Verify (включён по умолчанию, даже если план пустой) — захватывает результирующий MPTS через один из UDP-выходов PSS и сравнивает с целью; критические расхождения (TSID, ONID, service_id, name, type, LCN) → exit 5.

Повторный запуск всего конвейера идемпотентен: второй прогон сообщает no changes needed, если PSS уже соответствует инвентарю, а verify подтверждает это новым захватом.

Опции CLI

Выбор режима

Опция

Описание

По умолчанию

-f, --file <path>

Путь к migration JSON (используется как импорт по умолчанию без -i и как цель сохранения с -s)

./migrate.json

-s, --save

Сохранить захваченный инвентарь в migration-файл (комбинируется с потоковым входом; apply всё равно выполняется)

-o, --output <file>

Только захват: запись в файл, без apply

-i, --input <file>

Только apply: загрузка файла, без захвата

Захват

Опция

Описание

По умолчанию

-t, --time <sec>

Максимальная длительность захвата

30

-b, --bitrate <Mbps>

Подсказка битрейта TS для пейсинга в файловом режиме

38.8

Apply / Verify

Опция

Описание

По умолчанию

--target-mpts <id>

Пропустить запрос выбора MPTS; применить к этому stream id на PSS

--non-interactive

Авто-принять предложения диалога; завершиться при конфликте

--dry-run

Распечатать план POST’ов, ничего не отправлять

--pss-base <url>

Переопределить автообнаружение PSS (например, http://host:43971)

авто

--no-verify

Пропустить пост-apply-захват и diff

verify включён

--verify-time <s>

Окно захвата для верификации

10

--no-bitrate-adjust

Не поднимать mpegts-output-bitrate на целевом MPTS

подъём включён

--bitrate-headroom <pct>

Запас по битрейту над измеренным значением при подстройке

15

Прочее

Опция

Описание

-v, --verbose

Подробный лог (каждый HTTP POST и ветка диалога)

-h, --help

Показать справку и выйти

Migration-файл (migrate.json)

Человекочитаемый JSON с format_version: 1. Расположение по умолчанию ./migrate.json; переопределяется -f. Пример формы:

{
  "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" }
      ]
    }
  ]
}

Файл можно править перед повторным apply: переименовать сервисы, изменить LCN, перевернуть service_type, скорректировать network_namempts_migrate -i migrate.json отправит только изменённые поля.

Подключение к PSS

  • Автообнаружение: сканирование /proc/<pid>/comm на pss, чтение его --config-файла, выбор web-server.bind-port (по умолчанию 43971).

  • Вручную: --pss-base http://host:port полностью пропускает автообнаружение. Полезно для удалённого PSS или когда --dry-run должен сформировать план без живого PSS.

  • Admin REST API не требует аутентификации на localhost.

Верификация

Если --no-verify не указан (по умолчанию), после применения плана утилита:

  1. Ищет UDP-выход на localhost у целевого MPTS либо временно добавляет на 127.0.0.1:<auto> (с пометкой added by mpts_migrate for verification).

  2. Захватывает живой MPTS через этот выход в течение --verify-time секунд (по умолчанию 10).

  3. Сравнивает захваченный инвентарь с целью: - Критическое расхождение (TSID, ONID, service_id, name, type, LCN) → код выхода 5. - Мягкое расхождение (PMT PID, PCR PID, ES PID) → выводится как warning, код выхода 0.

  4. Если целевой MPTS перегружен (битрейт выхода ≥ настроенного mpegts-output-bitrate), печатается WARNING: target MPTS is overloaded — см. Bitrate adjust ниже.

Dry-run

--dry-run печатает каждый HTTP-запрос, который утилита послала бы (path, JSON-тело), но не отправляет ни одного. Полезно для:

  • Просмотра плана с оператором перед коммитом.

  • Генерации воспроизводимых наборов изменений в CI / change-management.

  • Работы при недоступном PSS (комбинировать с --pss-base http://host:port).

Dry-run не запускает верификацию.

Bitrate adjust

По умолчанию, если captured_bitrate × (1 + headroom%) превышает mpegts-output-bitrate целевого MPTS, утилита поднимает этот лимит на PSS перед применением изменений SI/PSI. Без достаточного запаса перегруженный MPTS теряет низкоприоритетные данные — типичные симптомы: пропадание звука на радиосервисах, периодические ошибки CRC EIT. Отключается через --no-bitrate-adjust, запас регулируется через --bitrate-headroom <pct> (по умолчанию 15).

Коды выхода

Код

Значение

0

Успех — apply и (если включена) верификация прошли чисто. Также возвращается успешным --dry-run.

1

Ошибка аргументов / файла / обнаружения

2

В источнике не найдено PAT — вход не является валидным MPEG-TS, либо окно захвата слишком короткое

3

Один или несколько HTTP POST’ов apply не прошли

4

Apply прошёл, но целевой MPTS не вернулся в состояние Running

5

Верификация не прошла — захваченный поток отличается от цели в критических полях

Ограничения и подводные камни

  • PSS должен заранее держать целевой MPTS и фидеры: утилита не создаёт новые потоки. Целевой MPTS и хотя бы столько SPTS-фидеров, сколько сервисов в инвентаре, должны существовать заранее; сервисы без свободного фидера пропускаются в диалоге.

  • Источник MPTS должен быть доступен при захвате (режимы 1, 2, save+apply): URL, переданный позиционным аргументом <input>, должен отдавать MPEG-TS-поток; для UDP multicast IGMP / firewall должен это разрешать.

  • ES PID remap применяется автоматически: per-service identity remap (mpegts-pid-oldmpegts-pid-new) генерируется для каждого PCR/video/audio/teletext/data PID, чтобы мультиплексированный вывод сохранял исходные PID-ы byte-exact. Раскладка PMT остаётся стабильной по миграциям — даже старые приёмники (STB до 2015 г., Samsung до серии H, LG до WebOS 3.0), кеширующие PID-ы, не требуют пересканирования.

  • Descriptor доставки должен соответствовать реальному носителю для приёмников, перенастраивающихся через NIT (DVB-T/T2/C/S). Несоответствующий блок delivery может увести приёмник на неверную частоту.

  • Согласованность LCN между основным и резервным MPTS критична для failover — если они различаются, позиции каналов в списке приёмника сместятся после переключения.

  • Provider name на PSS — общий для мультиплекса (один sdt-provider-name на muxer-input MPTS). Утилита применяет его автоматически, если все захваченные сервисы делят одно значение; если у разных сервисов разные provider_name, печатается warning, поле остаётся нетронутым — выбор за оператором.

  • Не инструмент конфигурации PSS: mpts_migrate трогает только поля идентичности SI/PSI, флаг pause на каждом фидере и (опционально) mpegts-output-bitrate. Кодеры, входы, шифрование, расписания и т.п. он не настраивает.

Диагностика

Симптом

Вероятная причина / решение

Error: no PAT seen in stream

источник не MPEG-TS, IGMP/firewall блокирует multicast или -t слишком короткий

Error: cannot reach PSS

использовать --pss-base http://host:port, чтобы обойти автообнаружение

Apply прошёл, но MPTS остаётся на паузе

проверить лог PSS; перезапустить с -v, чтобы увидеть полный план POST’ов

Верификация показывает критическое расхождение

сравнить goal vs capture в JSON; обычно фидер ошибочно сопоставлен с не тем сервисом в диалоге

WARNING: target MPTS is overloaded

поднять mpegts-output-bitrate на PSS либо --bitrate-headroom <higher %>; без запаса повреждаются аудио радиосервисов и PSI-таблицы