---
title: MPTS Migrate Perfect Streamer Toolkit v1.1 — миграция идентичности MPTS
url: https://doc2.pstreamer.tv/ru/manual/toolkit/mpts_migrate.html
lang: ru
product: Perfect Streamer
version: 2.0.2.362
---

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

Часть **Perfect Streamer Toolkit** — [https://pstreamer.tv](https://pstreamer.tv)

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

Инструмент входит в состав пакета **pstreamer** и после установки находится в `/opt/pss/tools/mpts_migrate` — отдельно устанавливать ничего не нужно.

## Предусловия

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

- **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`, если все исходные сервисы имеют одно и то же значение), дескриптор доставки (параметры наземного / кабельного / спутникового вещания), версии 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 автоматически.

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

На PSS 2.0.0.193 и новее план дополнительно включает у muxer-входа целевого MPTS штатный режим сохранения исходных PID (выключенный Automatic PID mapping) и задаёт для каждого сервиса захваченный порядковый номер программы в PAT (program order) — эфирный порядок программ переживает миграцию. Поддержка определяется автоматически по конфигурации целевого стримера; на более старых версиях эти ключи не отправляются (утилита печатает предупреждение), и единственным механизмом закрепления PID остаются identity-пары, а порядок программ в PAT не сохраняется.

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

- **Failover**: переключение декодеров с основного MPTS на резервный с сохранением каналов на стороне приёмника
- **Аппаратная миграция**: переезд работающего мультиплекса с одного PSS-хоста на другой без инструкций для зрителей
- **Снимок до / после обновления**: захват мультиплекса перед обновлением PSS, повторное применение после, чтобы гарантировать бит-идентичный SI/PSI
- **Ручная правка и повторное применение**: захват, правка `migrate.json` (переименование сервисов, смена LCN, корректировка `service_type`), повторное применение
- **Dry-run-проверка**: вывод каждого HTTP POST, который *был бы* отправлен, без воздействия на PSS

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

```bash
# 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
```

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

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 POST-запросы только для отличающихся полей. ES PID remap генерируется как identity-пары (`mpegts-pid-old` ≡ `mpegts-pid-new`), чтобы мультиплексированный вывод сохранял каждый исходный PID без изменений — включая PCR, video, audio, teletext, SCTE-35, DSM-CC. На PSS 2.0.0.193 и новее план дополнительно включает режим сохранения исходных PID у muxer-входа цели и задаёт порядок программ в PAT (см. *Что мигрируется*).
8. **Применение** — отправляет запланированные POST-запросы, затем переключает MPTS pause/unpause, чтобы PSS перечитал конфигурацию; при `--dry-run` план только печатается.
9. **Verify** (включён по умолчанию, даже если план пустой) — захватывает результирующий MPTS через один из UDP-выходов PSS и сравнивает с целью; критические расхождения (TSID, ONID, service_id, name, type, LCN) → код выхода 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:8808`) | авто |
| `--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`. Пример формы:

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

Файл можно править перед повторным 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` **не** указан (по умолчанию), после применения плана утилита:

1. Ищет UDP-выход на localhost у целевого MPTS либо временно добавляет на `127.0.0.1:<auto>` (с пометкой `added by mpts_migrate for verification`).
2. Захватывает живой MPTS через этот выход в течение `--verify-time` секунд (по умолчанию 10).
3. Сравнивает захваченный инвентарь с целью:

   - **Критическое** расхождение (TSID, ONID, network name, service_id, name, type, LCN) → код выхода **5**.
   - **Мягкое** расхождение (PMT PID, количество ES, имя провайдера, порядок программ в PAT) → выводится как предупреждение, код выхода 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, либо окно захвата слишком короткое; также возвращается, когда оператор отклонил подтверждение сопоставления или вышел из диалога (apply прерван) |
| `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 применяется автоматически**: для каждого сервиса 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-ы, не требуют пересканирования.
- **Дескриптор доставки должен соответствовать реальному носителю** для приёмников, перенастраивающихся через NIT (DVB-T/T2/C/S). Несоответствующий блок `delivery` может увести приёмник на неверную частоту.
- **Согласованность LCN** между основным и резервным MPTS критична для failover — если они различаются, позиции каналов в списке приёмника сместятся после переключения.
- **Provider name на PSS — общий для мультиплекса** (один `sdt-provider-name` на muxer-input MPTS). Утилита применяет его автоматически, если все захваченные сервисы имеют одно и то же значение; если у разных сервисов разные `provider_name`, печатается предупреждение, поле остаётся нетронутым — выбор за оператором.
- **Не инструмент конфигурации PSS**: `mpts_migrate` трогает только поля идентичности SI/PSI, флаг `pause` на каждом фидере, (опционально) `mpegts-output-bitrate`, а на PSS 2.0.0.193 и новее — ключи режима сохранения PID и порядка программ. Кодеры, входы, шифрование, расписания и т.п. он не настраивает.
- **На PSS старше 2.0.0.193** режим сохранения исходных PID у муксера и порядок программ в PAT не поддерживаются: утилита печатает предупреждение, PID закрепляются только identity-парами, а порядок программ после миграции может отличаться от исходного.

## Диагностика

| Симптом | Вероятная причина / решение |
| --- | --- |
| `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-ов |
| Верификация показывает критическое расхождение | сравнить цель и захваченный поток в JSON; обычно фидер ошибочно сопоставлен с не тем сервисом в диалоге |
| `WARNING: target MPTS is overloaded` | поднять `mpegts-output-bitrate` на PSS либо `--bitrate-headroom <higher %>`; без запаса повреждаются аудио радиосервисов и PSI-таблицы |
