TS Analyze Perfect Streamer Toolkit v2.2 — TR 101 290¶
Часть Perfect Streamer Toolkit — 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.
Что проверяется¶
Анализатор обходит каждый 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 multicast |
|
UDP multicast на указанном интерфейсе |
|
UDP unicast |
|
UDP unicast на loopback (тестовый источник) |
|
Локальный TS-файл |
RTP-инкапсуляция UDP определяется и распаковывается автоматически.
Опции¶
Опция |
Описание |
По умолчанию |
|---|---|---|
|
Длительность анализа в секундах |
|
|
Краткий итоговый отчёт |
– |
|
Полный детализированный отчёт |
да |
|
Подсказка битрейта TS для файлового режима |
|
|
Анализировать только указанный PCR PID (десятичный или |
авто |
|
Лимит ошибки повторения PCR в мс |
|
|
Пропустить анализ EIT — P3.7..P3.10 показываются как |
EIT включён |
|
Пропустить анализ NIT — P3.1, P3.2 показываются как |
NIT включён |
|
Отключить ANSI-цвета на выводе |
цвета включены |
|
Структурированный XML на stdout (без stderr) |
текст |
|
Показать справку |
– |
Примеры¶
# 30-секундная проверка TR 101 290 на multicast-потоке
ts_analyze -t 30 udp://239.10.10.1:1234
# краткая сводка, сохранение в лог (без цвета)
ts_analyze -s --no-color -t 60 udp://239.10.10.1:1234 > report.txt
# анализ TS-файла
ts_analyze -t 30 recording.ts
# анализ только одного PCR PID
ts_analyze -p 0x0100 -t 30 udp://239.10.10.1:1234
# машинно-читаемый XML для CI / мониторинга
ts_analyze --xml -t 30 udp://239.10.10.1:1234 > result.xml
# пропустить анализ EIT/NIT (например, для потоков, где их намеренно нет)
ts_analyze --no-eit --no-nit -t 30 udp://239.10.10.1:1234
Отключение анализа EIT или NIT¶
В некоторых потоках EIT или NIT намеренно отсутствуют (закрытые сети, лабораторные источники, OTT-only contribution и т.п.). Соответствующие проверки P3 из TR 101 290 будут всегда давать FAIL по итоговому шлюзу OVERALL — это просто шум.
Используйте --no-eit и/или --no-nit, чтобы исключить эти проверки:
Флаг |
Пропускаемые проверки |
Побочные эффекты |
|---|---|---|
|
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 подавляется. |
|
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 version="1.0" encoding="UTF-8"?>
<ts_analyze version="2.2">
<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 и т.п. без доработок парсинга.
Чтение отчёта¶
Цвета статусов¶
Статус |
Цвет |
Значение |
|---|---|---|
|
зелёный |
Проверка соответствует стандарту |
|
жёлтый |
Мягкое нарушение, не влияет на OVERALL |
|
красный |
Нарушение стандарта, влияет на OVERALL |
|
по умолчанию |
Только информационно |
Используйте --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 |
|---|---|---|
|
skipped (шум доминирует относительно границы ±30 ppm) |
нет |
|
WARN — только информационно |
нет |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 с — окно приёмо-сдаточных испытаний по DVB TR 101 297 — достаточно длинное, чтобы даже бёрстовый/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 на |
5 мин |
15 мин |
30 мин |
Калибровка / лабораторное измерение |
— |
30 мин |
1+ час |
Примеры:
# Быстрая проверка дрейфа PCR на реальном вещательном multicast (30 с)
ts_analyze -t 30 -s udp://239.1.1.1:5000
# Надёжная проверка на loopback-источнике (5 мин)
ts_analyze -t 300 -s udp://lo@127.0.0.1:12655
# Лабораторная приёмка (30 мин, полный отчёт в файл)
ts_analyze -t 1800 -f --no-color udp://239.1.1.1:5000 > acceptance.txt
Если один и тот же поток анализируется несколькими короткими окнами и значение дрейфа колеблется более чем на несколько ppm между окнами, узким местом является джиттер доставки (темп подачи отправителя или сеть), а не тактовый генератор кодера — увеличьте окно.
Коды выхода¶
Код |
Значение |
|---|---|
|
Анализ завершён, OVERALL = PASS |
|
Ошибка аргументов или входа |
|
В потоке нет данных PCR |
|
Длительность потока меньше минимума 2 с |
|
Анализ завершён, OVERALL = FAIL — нарушение TR 101 290 / ISO 13818-1 |
|
Прервано SIGINT (Ctrl+C) — анализ отменён, отчёт не выводится |
|
Прервано SIGTERM — анализ отменён, отчёт не выводится |
65 — это EX_DATAERR из POSIX <sysexits.h>: «входные данные некорректны». Используйте его в CI / мониторинге для шлюзования по соответствию потока:
ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
case $? in
65) echo "поток не соответствует — см. отчёт" >&2 ;;
130) echo "прервано пользователем" >&2 ;;
*) echo "ошибка инструмента" >&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.2 — TR 101 290 FULL REPORT
========================================================================
Source : udp://239.1.1.1:5000
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 Error : 0 errors PASS
| 1.4 Continuity Count Error : 0 errors PASS
| 1.6 PID Error (5s absence) : 0 errors PASS
...
========================================================================
TR 101 290 — PRIORITY 2 (recommended monitoring)
========================================================================
| 2.3 PCR Repetition Error : 0 errors PASS
| 2.5 PCR Accuracy Error : 0 errors PASS
...
========================================================================
OVERALL COMPLIANCE: PASS — stream is TR 101 290 compliant
========================================================================
Краткий отчёт¶
MPEG-TS Analyzer v2.2
TR 101 290 Summary | udp://239.1.1.1:5000 | 30.0s
----------------------------------------------------------------------------------------------------
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 p99=1.076 ms gaps>100ms=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.