---
title: TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290
url: https://doc2.pstreamer.tv/ru/manual/toolkit/ts_analyze.html
lang: ru
product: Perfect Streamer
version: 2.0.2.362
---

# TS Analyze Perfect Streamer Toolkit v2.3 — TR 101 290

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

Консольный **анализатор транспортного потока MPEG-TS** с проверкой соответствия **ETSI TR 101 290 V1.4.1** и валидацией модели T-STD буферов **ISO/IEC 13818-1**.

Читает **UDP multicast/unicast** или **TS-файлы**, автоматически обнаруживает PCR PID через PAT/PMT и выводит подробный или краткий отчёт на stdout.

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

## Что проверяется

Анализатор обходит каждый TS-пакет и сообщает о нарушениях:

- **Priority 1** (декодируемость TS): синхронизация TS, потеря синхронизации, наличие и CRC PAT/PMT, счётчик непрерывности, наличие PID
- **Priority 2** (рекомендуемый мониторинг): индикатор ошибок передачи, ошибки CRC, повторение / точность / разрывы PCR, интервал PTS, наличие CAT
- **Priority 3** (расширенный мониторинг): интервалы NIT/SDT/EIT/TDT, неупомянутые PID, переполнение / недополнение T-STD буферов

Дополнительно выдаёт:

- **Точность PCR** до ±500 нс — регрессия по байтовым позициям
- **Дрейф PCR** в ppm (только live-режим)
- **Модель T-STD буферов** для каждого элементарного потока (live-режим)
- Валидация **размеров SI-секций** относительно лимитов ISO/EN с предупреждениями о совместимости EIT-on-STB (>1024 Б)
- **UDP IAT** (inter-arrival time) — статистика джиттера на уровне дейтаграмм (только live-режим)

## Использование

```
ts_analyze [options] <input>
```

### Входы

| Форма | Описание |
| --- | --- |
| `udp://239.1.1.1:1234` | UDP multicast |
| `udp://eth0@239.1.1.1:1234` | UDP multicast на указанном интерфейсе |
| `udp://192.168.1.100:1234` | UDP unicast |
| `udp://lo@127.0.0.1:12655` | UDP unicast на loopback (тестовый источник) |
| `/path/to/file.ts` | Локальный TS-файл |

RTP-инкапсуляция UDP определяется и распаковывается автоматически.

### Опции

| Опция | Описание | По умолчанию |
| --- | --- | --- |
| `-t, --time <sec>` | Длительность анализа в секундах | `30` |
| `-s, --short` | Краткий итоговый отчёт | – |
| `-f, --full` | Полный детализированный отчёт | да |
| `-b, --bitrate <Mbps>` | Подсказка битрейта TS для файлового режима | `38.8` |
| `-p, --pcr-pid <pid>` | Анализировать только указанный PCR PID (десятичный или `0xHHHH`) | авто |
| `-l, --pcr-limit <ms>` | Лимит ошибки повторения PCR в мс | `40` |
| `--no-eit` | Пропустить анализ EIT — P3.7..P3.10 показываются как `N/A`, вклад EIT в P2.2 / итог по размерам секций исключается | EIT включён |
| `--no-nit` | Пропустить анализ NIT — P3.1, P3.2 показываются как `N/A`, вклад NIT в P2.2 / итог по размерам секций исключается | NIT включён |
| `--no-color` | Отключить ANSI-цвета на выводе | цвета включены |
| `--xml` | Структурированный XML на stdout (без stderr) | текст |
| `-h, --help` | Показать справку | – |

### Примеры

```bash
# 30-second TR 101 290 check on a multicast stream
ts_analyze -t 30 udp://239.10.10.1:1234

# short summary, save to log (no color)
ts_analyze -s --no-color -t 60 udp://239.10.10.1:1234 > report.txt

# analyze a TS file
ts_analyze -t 30 recording.ts

# analyze only a single PCR PID
ts_analyze -p 0x0100 -t 30 udp://239.10.10.1:1234

# machine-readable XML for CI / monitoring
ts_analyze --xml -t 30 udp://239.10.10.1:1234 > result.xml

# skip EIT/NIT analysis (e.g. for streams where they are intentionally absent)
ts_analyze --no-eit --no-nit -t 30 udp://239.10.10.1:1234
```

### Отключение анализа EIT или NIT

В некоторых потоках EIT или NIT намеренно отсутствуют (закрытые сети, лабораторные источники, только OTT-доставка и т.п.). Соответствующие проверки P3 из TR 101 290 будут всегда давать FAIL по итоговому шлюзу OVERALL — это просто шум.

Используйте `--no-eit` и/или `--no-nit`, чтобы исключить эти проверки:

| Флаг | Пропускаемые проверки | Побочные эффекты |
| --- | --- | --- |
| `--no-eit` | P3.7 (EIT actual P/F), P3.8 (EIT other P/F), P3.9 (EIT actual schedule), P3.10 (EIT other schedule) | Секции EIT не собираются, поэтому их вклад в P2.2 (CRC) и в сводку размеров SI-секций равен нулю. Предупреждение о совместимости EIT-on-STB подавляется. |
| `--no-nit` | P3.1 (NIT actual), P3.2 (NIT other) | Секции NIT не собираются, поэтому их вклад в P2.2 (CRC) и в сводку размеров SI-секций равен нулю. |

Пропущенные проверки появляются в отчёте как `N/A` с пометкой `disabled (--no-eit)` / `disabled (--no-nit)`, а в XML — как `applicable="false" result="N/A"`. В кратком отчёте вместо счётчика ошибок отображается `NIT=off` / `EIT=off`.

Флаги затрагивают только обработку EIT (PID `0x0012`) и NIT (PID `0x0010`) — все остальные проверки TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, дрейф PCR, IAT) выполняются как обычно.

### Режим вывода XML (`--xml`)

`--xml` заставляет анализатор выводить единый самодостаточный UTF-8 XML-документ на **stdout**. Вся служебная информация (баннер, `Stream locked`, `PCR PIDs discovered`, ежесекундный прогресс, сводка захвата, предупреждения о короткой длительности) подавляется; **stderr остаётся пустым**, если только не произошёл реальный сбой (не удалось открыть вход, нет PCR-данных, поток слишком короткий, прерывание сигналом). ANSI-цвета принудительно отключены.

Код выхода такой же, как в текстовом режиме: `0` при OVERALL=PASS, `65` при OVERALL=FAIL, плюс стандартные коды ошибок / сигналов (1, 2, 3, 130, 143).

Структура XML верхнего уровня:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<ts_analyze version="2.3">
  <source>udp://239.1.1.1:5000</source>
  <timestamp>2026-04-30T12:00:00+0300</timestamp>
  <duration_s>30.00</duration_s>
  <packets total="..." null="..."/>
  <ts_bitrate_mbps>20.012</ts_bitrate_mbps>

  <programs>
    <program number="1" pmt_pid="0x0100" pcr_pid="0x0101">
      <es pid="0x0101" stream_type="0x1b" name="H.264/AVC"/>
      <es pid="0x0102" stream_type="0x03" name="MPEG-2 Audio"/>
    </program>
  </programs>

  <tr101290>
    <check id="1.1" name="TS Sync Byte Error" applicable="true" errors="0" result="PASS"/>
    ...
    <check id="2.3" name="PCR Repetition Error"
           applicable="true" errors="0" result="PASS" soft_violations="3"/>
    ...
    <check id="3.4" name="Unreferenced PIDs" applicable="true" count="2" result="INFO"/>
    ...
  </tr101290>

  <si_section_size oversize_total="0" eit_stb_warn_total="12">
    <table name="EIT_actual_pf" max_bytes="1380" std_limit="4096"
           oversize="0" eit_stb_warn="12" result="WARN_STB"/>
    ...
  </si_section_size>

  <iat datagrams="33252" intervals="33251" min_ms="0.002" max_ms="5.009"
       avg_ms="0.150" stddev_ms="0.295" p95_ms="0.872" p99_ms="1.076"
       max_jitter_ms="4.272" gap_threshold_ms="100.0" gaps_over_threshold="0"/>

  <pcr_pids>
    <pcr_pid value="0x0101" sid="1" pcr_count="1500" discontinuities="0"
             estimated_bitrate_mbps="18.750">
      <interval samples="1499" min_ms="19.812" max_ms="20.195"
                avg_ms="20.001" p95_ms="20.102"
                iso_hard_violations="0" tr_soft_violations="0"
                rec_violations="0" result="PASS"/>
      <accuracy samples="1499" min_ns="-148.3" max_ns="201.7" abs_max_ns="201.7"
                avg_ns="2.1" stddev_ns="45.6" p95_ns="102.3"
                violations="0" result="PASS"/>
      <drift measured="true" ppm="0.618" limit_ppm="30"
             verdict_mode="informational" result="PASS"/>
      <tstd overflows="0" underflows="0" max_fill_bytes="34218" result="PASS">
        <es_buffer es_pid="0x0101" stream_type="0x1b"
                   capacity_bytes="3000000" measuring="true"
                   es_bitrate_mbps="15.200" max_fill_bytes="34218"
                   overflows="0" underflows="0"/>
      </tstd>
    </pcr_pid>
  </pcr_pids>

  <unreferenced_pids count="2">
    <pid value="0x01ff"/>
    <pid value="0x0200"/>
  </unreferenced_pids>

  <overall result="PASS"/>
</ts_analyze>
```

Ключевые соглашения:

- Все PID форматируются как `0xHHHH` (4-значный hex с префиксом `0x`).
- Атрибут `result` принимает значения `PASS` / `FAIL` / `WARN` / `N/A` / `INFO` / `SKIP` / `ok` / `WARN_STB`.
- Для неприменимых проверок (файловый режим, отсутствие скремблирования и т.п.) элемент всё равно присутствует с `applicable="false"` и `result="N/A"`, чтобы потребители схемы видели стабильную форму.
- `<drift>` несёт `verdict_mode="informational"` для `30 s ≤ T < 300 s` и `verdict_mode="hard"` для `T ≥ 300 s`; `result="SKIP"` для запусков короче 30 с.
- `<iat>` отсутствует для запусков в файловом режиме.
- `<overall>` отражает тот же шлюз, что и строка OVERALL в текстовом отчёте, и совпадает с кодом выхода процесса.

Вывод — корректно сформированный (well-formed) XML (валидируется через `xmllint --noout`); подавайте напрямую в XSLT, Python `lxml` и т.п. без доработок парсинга.

## Чтение отчёта

### Цвета статусов

| Статус | Цвет | Значение |
| --- | --- | --- |
| `PASS` / `ok` | зелёный | Проверка соответствует стандарту |
| `WARN` / `WARNING` / `WARN(STB)` | жёлтый | Мягкое нарушение, не влияет на OVERALL |
| `FAIL` / `ERROR` | красный | Нарушение стандарта, влияет на OVERALL |
| `INFO` / `NOTE` / `N/A` | по умолчанию | Только информационно |

Используйте `--no-color` при перенаправлении в лог-файлы или в не-ANSI-терминалы.

### Минимальная длительность анализа

| Длительность | Покрытие | Код выхода |
| --- | --- | --- |
| **< 2 с** | Недостаточно — анализ отклоняется | **3** (ошибка) |
| **2–10 с** | P1 + P2 надёжны; некоторым проверкам P3 может не хватить данных | 0 + WARN |
| **10–30 с** | P1 + P2 + большинство P3; TDT (30 с) может не успеть | 0 + NOTE |
| **≥ 30 с** | Полное покрытие всех проверок TR 101 290 | 0 |

Длительность по умолчанию — **30 секунд**, достаточно для полного покрытия TR 101 290. Используйте `-t <sec>` для увеличения (например, для приёмо-сдаточных тестов по дрейфу PCR) или сокращения (быстрые smoke-проверки).

Во время работы анализатор каждую секунду обновляет однострочный индикатор прогресса на stderr:

```
Progress: 47.3%  (14.2s / 30.0s, 330614 packets)
```

Строка использует carriage-return (`\r`), чтобы оставаться одной строкой в терминале; перенаправьте stderr (`2>/dev/null`), чтобы её подавить.

### Вердикт по дрейфу PCR — двухуровневое окно

Допуск тактовой частоты PCR по **ISO/IEC 13818-1 §2.4.2.1** и **ETSI TR 101 290** — **±30 ppm**. Значение дрейфа в отчёте получается линейной регрессией кумулятивных секунд PCR относительно времени прихода по часам стенда; статистическая ошибка убывает как 1 / T^(3/2), поэтому окно анализа должно быть достаточно длинным, чтобы шум измерения был ниже границы ±30 ppm.

Поэтому анализатор ставит вердикт по дрейфу в зависимость от длительности анализа:

| Окно | Вердикт при выходе дрейфа за допуск | Влияние на OVERALL |
| --- | --- | --- |
| `T < 30 с` | **skipped** (шум доминирует относительно границы ±30 ppm) | нет |
| `30 с ≤ T < 300 с` | **WARN** — только информационно | нет |
| `T ≥ 300 с` | **FAIL** | OVERALL = FAIL, exit 65 |

`300 с` — приёмочное окно (значение продукта; стандарт **ETSI TR 101 290** интервалы измерений не нормирует) — достаточно длинное, чтобы даже бёрстовый/loopback-канал доставки усреднялся ниже 1 ppm шума измерения, и выход за допуск отражал тактовый генератор кодера, а не сеть. Полный отчёт показывает текущий уровень в строке `Verdict mode` блока PCR DRIFT.

Чтобы получить жёсткий вердикт PASS/FAIL по дрейфу, запускайте с `-t 300` или больше.

Рекомендации по качеству источника (информационно; уровни вердикта не меняют):

| Источник | Минимальное окно для ±5 ppm | Для ±2 ppm | Приёмка |
| --- | --- | --- | --- |
| Вещательный multicast (CBR-сеть, джиттер < 100 мкс) | **30 с** | 60 с | 5 мин |
| Стабильная IP-сеть (джиттер < 200 мкс) | **30 с** | 2 мин | 5–10 мин |
| Loopback / бёрстовый отправитель (UDP unicast на `lo`) | **5 мин** | 15 мин | 30 мин |
| Калибровка / лабораторное измерение | — | 30 мин | 1+ час |

Примеры:

```bash
# Quick PCR drift check on a real broadcast multicast (30 s)
ts_analyze -t 30 -s udp://239.1.1.1:5000

# Reliable check on a loopback source (5 min)
ts_analyze -t 300 -s udp://lo@127.0.0.1:12655

# Lab acceptance (30 min, full report to file)
ts_analyze -t 1800 -f --no-color udp://239.1.1.1:5000 > acceptance.txt
```

Если один и тот же поток анализируется несколькими короткими окнами и значение дрейфа колеблется более чем на несколько ppm между окнами, узким местом является джиттер доставки (темп подачи отправителя или сеть), а не тактовый генератор кодера — увеличьте окно.

### Коды выхода

| Код | Значение |
| --- | --- |
| `0` | Анализ завершён, **OVERALL = PASS** |
| `1` | Ошибка аргументов или входа |
| `2` | В потоке нет данных PCR |
| `3` | Длительность потока меньше минимума 2 с, либо данные не получены вовсе (источник не вещает, неверный адрес, не выполнено multicast-подключение, брандмауэр или неверный интерфейс — анализатор печатает подсказку) |
| `65` | Анализ завершён, **OVERALL = FAIL** — нарушение TR 101 290 / ISO 13818-1 |
| `130` | Прервано **SIGINT** (Ctrl+C) — анализ отменён, отчёт не выводится |
| `143` | Прервано **SIGTERM** — анализ отменён, отчёт не выводится |

`65` — это `EX_DATAERR` из POSIX `<sysexits.h>`: «входные данные некорректны». Используйте его в CI / мониторинге для шлюзования по соответствию потока:

```bash
ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
    case $? in
        65)  echo "stream does not conform — see report" >&2 ;;
        130) echo "interrupted by user" >&2 ;;
        *)   echo "tool error" >&2 ;;
    esac
}
```

Коды 130/143 следуют конвенции POSIX shell `128 + signal_number`, поэтому `$?` после `Ctrl+C` совпадает с тем, что bash возвращает для любого процесса, убитого SIGINT/SIGTERM. При прерывании анализатор выводит одну строку на stderr (`Analysis interrupted by signal N — no report produced.`) и полностью пропускает генерацию отчёта.

## Пример вывода

### Полный отчёт (фрагмент)

```
========================================================================
  MPEG-TS ANALYZER v2.3 — TR 101 290 FULL REPORT
  Perfect Streamer Toolkit https://pstreamer.tv
========================================================================
  Source     : udp://239.1.1.1:5000
  Timestamp  : 2026-04-30 12:00:00
  Duration   : 30.00 s
  Packets    : 398936 total, 12045 null
  TS bitrate : 20.012 Mbit/s
------------------------------------------------------------------------

========================================================================
  TR 101 290 — PRIORITY 1 (TS decodability)
========================================================================
  |  1.1   TS Sync Byte                  :        0           PASS
  |  1.4   Continuity Count              :        0           PASS
  |  1.6   PID Absence (5s)              :        0           PASS
  ...

========================================================================
  TR 101 290 — PRIORITY 2 (recommended monitoring)
========================================================================
  |  2.3   PCR Repetition                :        0           PASS
  |  2.5   PCR Accuracy                  :        0           PASS
  ...

========================================================================
  OVERALL COMPLIANCE: PASS  — stream is TR 101 290 compliant
========================================================================
```

### Краткий отчёт

```
MPEG-TS Analyzer v2.3 | Perfect Streamer Toolkit https://pstreamer.tv
TR 101 290 Summary | udp://239.1.1.1:5000 | 30.0s | 2026-04-30 12:00:00
----------------------------------------------------------------------------------------------------
  P1: sync=0 CC=0 PAT=0 PMT=0 PID=0  P2: TEI=0 CRC=0 PTS=0  P3: NIT=0 SDT=0 EIT=0 TDT=0 unref=2
  IAT: dgrams=33252 avg=0.150 ms max=5.009 ms stddev=0.295 ms p99=1.076 ms gaps>100.000 ms=0
----------------------------------------------------------------------------------------------------
PCR PID       SID     Count     Intv max      Jitter max    Drift     Interval  Accuracy  T-STD
----------------------------------------------------------------------------------------------------
0x0101        1       1500      20.195 ms     76.4 ns       0ppm      PASS      PASS      PASS
----------------------------------------------------------------------------------------------------
OVERALL: PASS
```

## Примечания

- **Файловый режим**: дрейф PCR, модель T-STD буферов и UDP IAT не измеряются — для них требуется референс реального времени. Остальные проверки работают в обоих режимах.
- **Один транспортный поток**: за раз анализируется один MPTS или SPTS.
