TS Analyze Perfect Streamer Toolkit v2.2 — TR 101 290¶
Parte do Perfect Streamer Toolkit — https://pstreamer.tv
Analisador em console de fluxos de transporte MPEG-TS com verificação de conformidade ETSI TR 101 290 V1.4.1 e validação do modelo de buffers T-STD ISO/IEC 13818-1.
Lê UDP multicast/unicast ou arquivos TS, detecta automaticamente os PCR PIDs via PAT/PMT e emite um relatório detalhado ou breve no stdout.
O que é verificado¶
O analisador percorre cada pacote TS e relata as violações:
Priority 1 (decodificabilidade do TS): sync TS, perda de sync, presença e CRC de PAT/PMT, contador de continuidade, presença de PIDs
Priority 2 (monitoramento recomendado): indicador TEI, erros CRC, repetição / precisão / descontinuidades do PCR, intervalo PTS, presença de CAT
Priority 3 (monitoramento estendido): intervalos NIT/SDT/EIT/TDT, PIDs não referenciados, overflow / underflow dos buffers T-STD
Adicionalmente, emite:
Precisão de PCR até ±500 ns — regressão por posições de byte
Drift de PCR em ppm (apenas modo live)
Modelo de buffers T-STD para cada fluxo elementar (modo live)
Validação dos tamanhos das seções SI em relação aos limites ISO/EN com avisos de compatibilidade EIT-on-STB (>1024 B)
UDP IAT (inter-arrival time) — estatísticas de jitter no nível do datagrama (apenas modo live)
Uso¶
ts_analyze [options] <input>
Entradas¶
Forma |
Descrição |
|---|---|
|
UDP multicast |
|
UDP multicast na interface indicada |
|
UDP unicast |
|
UDP unicast em loopback (fonte de teste) |
|
Arquivo TS local |
UDP encapsulado em RTP é detectado e desencapsulado automaticamente.
Opções¶
Opção |
Descrição |
Padrão |
|---|---|---|
|
Duração da análise em segundos |
|
|
Relatório resumido breve |
– |
|
Relatório detalhado completo |
sim |
|
Dica de bitrate TS para o modo de arquivo |
|
|
Analisar apenas o PCR PID especificado (decimal ou |
automático |
|
Limite de erro de repetição do PCR em ms |
|
|
Pular a análise de EIT — P3.7..P3.10 aparecem como |
EIT habilitado |
|
Pular a análise de NIT — P3.1, P3.2 aparecem como |
NIT habilitado |
|
Desativar cores ANSI na saída |
cores ativadas |
|
XML estruturado no stdout (sem stderr) |
texto |
|
Mostrar ajuda |
– |
Exemplos¶
# 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
Desativar a análise de EIT ou NIT¶
Em alguns fluxos, o EIT ou NIT são intencionalmente omitidos (redes fechadas, fontes laboratoriais, contribuição OTT-only etc.). Nesse caso, as verificações P3 correspondentes do TR 101 290 sempre falharão na conclusão OVERALL — isso é apenas ruído.
Use --no-eit e/ou --no-nit para excluir essas verificações:
Sinalizador |
Verificações ignoradas |
Efeitos colaterais |
|---|---|---|
|
P3.7 (EIT actual P/F), P3.8 (EIT other P/F), P3.9 (EIT actual schedule), P3.10 (EIT other schedule) |
As seções EIT não são montadas; sua contribuição para P2.2 (CRC) e o resumo de tamanhos SI é zero. O aviso de compatibilidade EIT-on-STB é suprimido. |
|
P3.1 (NIT actual), P3.2 (NIT other) |
As seções NIT não são montadas; sua contribuição para P2.2 (CRC) e para o resumo de tamanhos SI é zero. |
As verificações puladas aparecem no relatório como N/A com a marca disabled (--no-eit) / disabled (--no-nit), e no XML como applicable="false" result="N/A". No relatório resumido, em vez do contador de erros, são exibidos NIT=off / EIT=off.
Os flags afetam apenas o processamento de EIT (PID 0x0012) e NIT (PID 0x0010) — todas as demais verificações TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, drift do PCR, IAT) ocorrem normalmente.
Modo de saída XML (--xml)¶
--xml faz o analisador emitir um único documento XML UTF-8 autossuficiente em stdout. Toda a informação de serviço (banner, «Stream locked», «PCR PIDs discovered», progresso por segundo, resumo da captura, avisos sobre duração curta) é suprimida; stderr permanece vazio a menos que ocorra uma falha real (não foi possível abrir a entrada, sem dados de PCR, fluxo demasiado curto, interrupção por sinal). As cores ANSI são forçadamente desativadas.
O código de saída é o mesmo do modo texto: 0 em OVERALL=PASS, 65 em OVERALL=FAIL, mais os códigos padrão de erro/sinais (1, 2, 3, 130, 143).
Estrutura XML de nível superior:
<?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>
Convenções principais:
Todos os PIDs são formatados como
0xHHHH(hex de 4 dígitos com prefixo0x).O atributo
resultassume os valoresPASS/FAIL/WARN/N/A/INFO/SKIP/ok/WARN_STB.Para verificações não aplicáveis (modo arquivo, ausência de scrambling etc.), o elemento ainda assim aparece com
applicable="false"eresult="N/A"para que os consumidores do esquema vejam um formato estável.<drift>levaverdict_mode="informational"para30 s ≤ T < 300 severdict_mode="hard"paraT ≥ 300 s;result="SKIP"para execuções menores que 30 s.<iat>está ausente em execuções no modo de arquivo.<overall>reflete o mesmo gate da linha OVERALL no relatório de texto e coincide com o código de saída do processo.
A saída é XML bem formado (validado com xmllint --noout); pode ser enviada diretamente para XSLT, Python lxml etc. sem ajustes de parsing.
Leitura do relatório¶
Cores de status¶
Estado |
Cor |
Valor |
|---|---|---|
|
verde |
A verificação satisfaz o padrão |
|
amarelo |
Violação leve, não afeta o OVERALL |
|
vermelho |
Violação do padrão, afeta o OVERALL |
|
por padrão |
Apenas informativo |
Use --no-color ao redirecionar para arquivos de log ou terminais não-ANSI.
Duração mínima da análise¶
Duração |
Cobertura |
Código de saída |
|---|---|---|
< 2 s |
Insuficiente — análise recusada |
3 (erro) |
2–10 s |
P1 + P2 confiáveis; algumas verificações P3 podem não ter dados suficientes |
0 + WARN |
10–30 s |
P1 + P2 + a maioria dos P3; TDT (30 s) pode não ter dados |
0 + NOTE |
≥ 30 s |
Cobertura completa de todas as verificações TR 101 290 |
0 |
A duração padrão é de 30 segundos — suficiente para cobertura completa do TR 101 290. Use -t <sec> para aumentar (por exemplo, para testes de aceitação por drift de PCR) ou reduzir (verificações smoke rápidas).
Durante o trabalho, o analisador atualiza a cada segundo um indicador de progresso de uma linha no stderr:
Progress: 47.3% (14.2s / 30.0s, 330614 packets)
A linha usa carriage-return (\r) para permanecer em uma única linha no terminal; redirecione stderr (2>/dev/null) para ocultá-la.
Veredito do drift do PCR — janela de dois níveis¶
A tolerância da frequência do relógio PCR conforme ISO/IEC 13818-1 §2.4.2.1 e ETSI TR 101 290 é de ±30 ppm. O valor de drift no relatório é obtido por regressão linear dos segundos cumulativos de PCR em relação ao tempo de chegada pelo relógio do equipamento; o erro estatístico decresce como 1 / T^(3/2), portanto a janela de análise deve ser longa o suficiente para que o ruído de medição fique bem abaixo do limite de ±30 ppm.
Por isso, o analisador condiciona o veredito do drift à duração da análise:
Janela |
Veredito se o drift sair do limite |
Impacto no OVERALL |
|---|---|---|
|
skipped (o ruído domina o limite de ±30 ppm) |
nenhum |
|
WARN — apenas informativo |
nenhum |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 s é a janela de testes de aceitação do DVB TR 101 297 — longa o suficiente para que mesmo uma entrega bursty/loopback fique abaixo de 1 ppm de ruído de medição, de modo que um resultado fora de especificação reflita o oscilador do encoder, não a rede. O relatório completo mostra o nível atual na linha Verdict mode do bloco PCR DRIFT.
Para obter um veredito PASS/FAIL rígido do drift, execute com -t 300 ou mais.
Recomendações sobre a qualidade da fonte (informativo; os níveis do veredito não mudam):
Fonte |
Janela mínima para ±5 ppm |
Para ±2 ppm |
Aceitação |
|---|---|---|---|
Multicast broadcast (rede CBR, jitter < 100 µs) |
30 s |
60 s |
5 min |
Rede IP estável (jitter < 200 µs) |
30 s |
2 min |
5–10 min |
Loopback / emissor em rajadas (UDP unicast em |
5 min |
15 min |
30 min |
Calibração / medição em laboratório |
— |
30 min |
1+ hora |
Exemplos:
# Быстрая проверка дрейфа 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
Se o mesmo fluxo for analisado em várias janelas curtas e o valor do drift variar mais do que alguns ppm entre janelas, o gargalo é o jitter de entrega (ritmo de envio do emissor ou da rede), não o relógio do codificador — aumente a janela.
Códigos de saída¶
Código |
Valor |
|---|---|
|
Análise concluída, OVERALL = PASS |
|
Erro de argumento ou entrada |
|
O fluxo não contém dados de PCR |
|
Duração do fluxo abaixo do mínimo de 2 s |
|
Análise concluída, OVERALL = FAIL — violação de TR 101 290 / ISO 13818-1 |
|
Interrompido por SIGINT (Ctrl+C) — análise abortada, sem relatório |
|
Interrompido por SIGTERM — análise abortada, sem relatório |
65 é EX_DATAERR do POSIX <sysexits.h>: «input data was incorrect». Use-o em CI/monitoramento como gate de conformidade do fluxo:
ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
case $? in
65) echo "поток не соответствует — см. отчёт" >&2 ;;
130) echo "прервано пользователем" >&2 ;;
*) echo "ошибка инструмента" >&2 ;;
esac
}
Os códigos 130/143 seguem a convenção POSIX shell 128 + signal_number, então $? após Ctrl+C coincide com o que o bash retorna para qualquer processo encerrado por SIGINT/SIGTERM. Em caso de interrupção, o analisador imprime uma linha em stderr (Analysis interrupted by signal N — no report produced.) e pula totalmente a geração do relatório.
Exemplo de saída¶
Relatório completo (trecho)¶
========================================================================
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
========================================================================
Relatório breve¶
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
Notas¶
Modo arquivo: drift do PCR, modelo de buffers T-STD e UDP IAT não são medidos — requerem referência em tempo real. As demais verificações funcionam em ambos os modos.
Um único fluxo de transporte: é analisado um MPTS ou SPTS por vez.