MPTS Migrate Perfect Streamer Toolkit v1.0 — миграция идентичности MPTS¶
Часть Perfect Streamer Toolkit — https://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-old ≡ mpegts-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
Рабочий процесс¶
Захват — утилита открывает поток, парсит PAT / PMT / SDT / NIT / EIT в течение
-tсекунд (по умолчанию 30) и строит инвентарь; измеряется суммарный битрейт потока.(Опционально) Сохранение — с
-sили-oинвентарь записывается в JSON для повторного использования.Поиск PSS — обнаруживает работающий PSS через скан
/proc, читаетpss.jsonдля получения admin-порта (по умолчанию43971);--pss-base http://host:portобходит автообнаружение.Подтверждение маппинга — интерактивный диалог спрашивает, как сопоставить каждый захваченный сервис с существующим SPTS-фидером;
--non-interactiveпринимает предложения и завершает работу при конфликте;--target-mpts <id>пропускает запрос выбора MPTS.Авто-снятие паузы с фидеров — для каждого сопоставленного SPTS / muxer-output утилита посылает
{"pause":false}, если фидер был на паузе, чтобы мультиплексор реально получал данные после apply.Авто-настройка битрейта — если
captured_bitrate × (1 + headroom%)превышаетmpegts-output-bitrateцелевого MPTS, утилита поднимает этот лимит на PSS одним POST (округлённым вверх до ближайших 1000 kbps). Отключается через--no-bitrate-adjust.Планирование — сравнивает инвентарь с текущим деревом
/config/streamна PSS, готовит HTTP POSTs только для отличающихся полей. ES PID remap генерируется как identity-пары (mpegts-pid-old≡mpegts-pid-new), чтобы мультиплексированный вывод сохранял каждый исходный PID без изменений — включая PCR, video, audio, teletext, SCTE-35, DSM-CC.Применение — отправляет запланированные POSTs, затем переключает MPTS pause/unpause, чтобы PSS перечитал конфигурацию; при
--dry-runплан только печатается.Verify (включён по умолчанию, даже если план пустой) — захватывает результирующий MPTS через один из UDP-выходов PSS и сравнивает с целью; критические расхождения (TSID, ONID, service_id, name, type, LCN) → exit 5.
Повторный запуск всего конвейера идемпотентен: второй прогон сообщает no changes needed, если PSS уже соответствует инвентарю, а verify подтверждает это новым захватом.
Опции CLI¶
Выбор режима¶
Опция |
Описание |
По умолчанию |
|---|---|---|
|
Путь к migration JSON (используется как импорт по умолчанию без |
|
|
Сохранить захваченный инвентарь в migration-файл (комбинируется с потоковым входом; apply всё равно выполняется) |
— |
|
Только захват: запись в файл, без apply |
— |
|
Только apply: загрузка файла, без захвата |
— |
Захват¶
Опция |
Описание |
По умолчанию |
|---|---|---|
|
Максимальная длительность захвата |
|
|
Подсказка битрейта TS для пейсинга в файловом режиме |
|
Apply / Verify¶
Опция |
Описание |
По умолчанию |
|---|---|---|
|
Пропустить запрос выбора MPTS; применить к этому stream id на PSS |
— |
|
Авто-принять предложения диалога; завершиться при конфликте |
— |
|
Распечатать план POST’ов, ничего не отправлять |
— |
|
Переопределить автообнаружение PSS (например, |
авто |
|
Пропустить пост-apply-захват и diff |
verify включён |
|
Окно захвата для верификации |
|
|
Не поднимать |
подъём включён |
|
Запас по битрейту над измеренным значением при подстройке |
|
Прочее¶
Опция |
Описание |
|---|---|
|
Подробный лог (каждый HTTP POST и ветка диалога) |
|
Показать справку и выйти |
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_name — mpts_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 не указан (по умолчанию), после применения плана утилита:
Ищет UDP-выход на localhost у целевого MPTS либо временно добавляет на
127.0.0.1:<auto>(с пометкойadded by mpts_migrate for verification).Захватывает живой MPTS через этот выход в течение
--verify-timeсекунд (по умолчанию 10).Сравнивает захваченный инвентарь с целью: - Критическое расхождение (TSID, ONID, service_id, name, type, LCN) → код выхода 5. - Мягкое расхождение (PMT PID, PCR PID, ES PID) → выводится как warning, код выхода 0.
Если целевой 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).
Коды выхода¶
Код |
Значение |
|---|---|
|
Успех — apply и (если включена) верификация прошли чисто. Также возвращается успешным |
|
Ошибка аргументов / файла / обнаружения |
|
В источнике не найдено PAT — вход не является валидным MPEG-TS, либо окно захвата слишком короткое |
|
Один или несколько HTTP POST’ов apply не прошли |
|
Apply прошёл, но целевой MPTS не вернулся в состояние Running |
|
Верификация не прошла — захваченный поток отличается от цели в критических полях |
Ограничения и подводные камни¶
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-old≡mpegts-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. Кодеры, входы, шифрование, расписания и т.п. он не настраивает.
Диагностика¶
Симптом |
Вероятная причина / решение |
|---|---|
|
источник не MPEG-TS, IGMP/firewall блокирует multicast или |
|
использовать |
Apply прошёл, но MPTS остаётся на паузе |
проверить лог PSS; перезапустить с |
Верификация показывает критическое расхождение |
сравнить goal vs capture в JSON; обычно фидер ошибочно сопоставлен с не тем сервисом в диалоге |
|
поднять |