TS Analyze Perfect Streamer Toolkit v2.4 — TR 101 290¶
Parte do Perfect Streamer Toolkit — https://meshwork.pstreamer.tv
Analisador de fluxo de transporte MPEG-TS de linha de comando, com verificação de conformidade com ETSI TR 101 290 V1.4.1 e validação do modelo de buffers T-STD da ISO/IEC 13818-1.
Lê UDP multicast/unicast ou arquivos TS, detecta automaticamente os PID de PCR por meio de PAT/PMT e imprime um relatório detalhado ou resumido em stdout.
A ferramenta faz parte do pacote pstreamer e, após a instalação, fica em /opt/pss/tools/ts_analyze — não é necessário instalar nada separadamente.
O que é verificado¶
O analisador percorre cada pacote TS e informa as violações:
Priority 1 (decodificabilidade do TS): sincronismo TS, perda de sincronismo, presença e CRC de PAT/PMT, contador de continuidade, presença de PID
Priority 2 (monitoramento recomendado): indicador de erro de transporte, erros de CRC, repetição / precisão / descontinuidades do PCR, intervalo de PTS, presença de CAT
Priority 3 (monitoramento estendido): intervalos de NIT/SDT/EIT/TDT, PIDs não referenciados, transbordamento / esvaziamento dos buffers T-STD
Adicionalmente, informa:
Precisão do PCR até ±500 ns — regressão sobre as posições de byte
Deriva do PCR em ppm (somente no 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 dos datagramas (somente no modo live)
Utilização¶
ts_analyze [options] <input>
Entradas¶
Forma |
Descrição |
|---|---|
|
UDP multicast |
|
UDP multicast na interface especificada |
|
UDP unicast |
|
UDP unicast em loopback (fonte de teste) |
|
Arquivo TS local |
O encapsulamento RTP sobre UDP é detectado e desempacotado automaticamente.
Opções¶
Opção |
Descrição |
Padrão |
|---|---|---|
|
Duração da análise em segundos |
|
|
Relatório-resumo final |
– |
|
Relatório completo detalhado |
sim |
|
Sugestão de taxa de bits do TS para o modo de arquivo |
|
|
Analisar somente o PID de PCR indicado (decimal ou |
automático |
|
Limite de erro de repetição do PCR em ms |
|
|
Ignorar a análise da EIT — P3.7..P3.10 são exibidos como |
EIT ativado |
|
Ignorar a análise da NIT — P3.1, P3.2 são exibidos como |
NIT ativado |
|
Desativar as cores ANSI na saída |
cores ativadas |
|
XML estruturado em stdout (sem stderr) |
texto |
|
Exibir a ajuda |
– |
Exemplos¶
# 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
Desativação da análise de EIT ou NIT¶
Em alguns fluxos, a EIT ou a NIT estão ausentes de propósito (redes fechadas, fontes de laboratório, entrega exclusivamente OTT etc.). Nesses fluxos, as verificações P3 correspondentes da TR 101 290 sempre dão FAIL na avaliação final OVERALL, e esse FAIL não significa nada.
Utilize --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 coletadas, portanto a sua contribuição para P2.2 (CRC) e para o resumo dos tamanhos das seções SI é nula. O aviso de compatibilidade EIT-on-STB é suprimido. |
|
P3.1 (NIT actual), P3.2 (NIT other) |
As seções NIT não são coletadas, portanto a sua contribuição para P2.2 (CRC) e para o resumo dos tamanhos das seções SI é nula. |
As verificações ignoradas aparecem no relatório como N/A com a marcação 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, é exibido NIT=off / EIT=off.
Os sinalizadores afetam apenas o processamento da EIT (PID 0x0012) e da NIT (PID 0x0010) — todas as demais verificações da TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, deriva do PCR, IAT) são executadas normalmente.
Modo de saída XML (--xml)¶
Com --xml, o analisador emite em stdout um único documento XML UTF-8 autocontido. Todas as informações auxiliares (o banner, Stream locked, PCR PIDs discovered, o progresso a cada segundo, o resumo da captura, os avisos de duração curta) são suprimidas; o stderr permanece vazio, a menos que ocorra uma falha (não foi possível abrir a entrada, não há dados de PCR, o fluxo é curto demais, interrupção por sinal). As cores ANSI são desativadas à força.
O código de saída é o mesmo do modo texto: 0 para OVERALL=PASS, 65 para OVERALL=FAIL, além dos códigos padrão de erro / sinal (1, 2, 3, 130, 143).
Estrutura XML de nível superior:
<?xml version="1.0" encoding="UTF-8"?>
<ts_analyze version="2.4">
<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 o prefixo0x).O atributo
resultassume os valoresPASS/FAIL/WARN/N/A/INFO/SKIP/ok/WARN_STB.Para as verificações não aplicáveis (modo de arquivo, ausência de embaralhamento etc.), o elemento continua presente, com
applicable="false"eresult="N/A", para que os programas que analisam o XML sempre recebam a mesma estrutura.<drift>contémverdict_mode="informational"para30 s ≤ T < 300 severdict_mode="hard"paraT ≥ 300 s;result="SKIP"para execuções com menos de 30 s.<iat>está ausente nas execuções em modo de arquivo.<overall>reflete o mesmo resultado final que a linha OVERALL do relatório em texto e coincide com o código de saída do processo.
A saída é um XML bem formado (well-formed), validado por xmllint --noout; envie-a diretamente a XSLT, ao lxml do Python etc., sem adaptações de parsing.
Leitura do relatório¶
Cores dos estados¶
Estado |
Cor |
Significado |
|---|---|---|
|
verde |
A verificação está em conformidade com a norma |
|
amarelo |
Violação leve, não afeta o OVERALL |
|
vermelho |
Violação da norma, afeta o OVERALL |
|
padrão |
Apenas informativo |
Utilize --no-color ao redirecionar para arquivos de log ou para terminais não ANSI.
Duração mínima da análise¶
Duração |
Cobertura |
Código de saída |
|---|---|---|
< 2 s |
Insuficiente — a análise é rejeitada |
3 (erro) |
2–10 s |
P1 + P2 são confiáveis; algumas verificações P3 podem não dispor de dados suficientes |
0 + WARN |
10–30 s |
P1 + P2 + a maior parte de P3; o TDT (30 s) pode não ser concluído a tempo |
0 + NOTE |
≥ 30 s |
Cobertura completa de todas as verificações da TR 101 290 |
0 |
A duração padrão é de 30 segundos, suficiente para a cobertura completa da TR 101 290. Com a opção -t <sec>, a duração é aumentada (por exemplo, para testes de aceitação da deriva do PCR) ou reduzida (para verificações rápidas de smoke).
Durante a execução, o analisador atualiza a cada segundo um indicador de progresso de uma única linha em stderr:
Progress: 47.3% (14.2s / 30.0s, 330614 packets)
A linha é redesenhada com o caractere carriage return (\r) e ocupa uma única linha no terminal; para suprimi-la, redirecione o stderr (2>/dev/null).
Veredito da deriva do PCR — janela de dois níveis¶
A tolerância do relógio do PCR conforme a ISO/IEC 13818-1 §2.4.2.1 e a ETSI TR 101 290 é de ±30 ppm. O valor da deriva apresentado no relatório é obtido por regressão linear dos segundos acumulados do PCR em relação ao instante de chegada medido pelo relógio da bancada; 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 abaixo do limite de ±30 ppm.
Por isso, o analisador condiciona o veredito da deriva à duração da análise:
Janela |
Veredito quando a deriva excede a tolerância |
Efeito sobre o OVERALL |
|---|---|---|
|
skipped (o ruído domina sobre o limite de ±30 ppm) |
nenhum |
|
WARN — apenas informativo |
nenhum |
|
FAIL |
OVERALL = FAIL, exit 65 |
300 s é a janela de aceitação (valor definido pelo produto; a norma ETSI TR 101 290 não fixa os intervalos de medição). Ela é longa o suficiente para que, mesmo em um canal de entrega em rajadas/loopback, o ruído de medição seja promediado abaixo de 1 ppm e um resultado fora da tolerância reflita o relógio do codificador, e 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 rígido PASS/FAIL sobre a deriva, execute com -t 300 ou mais.
Recomendações quanto à qualidade da fonte (informativas; não alteram os níveis de veredito):
Fonte |
Janela mínima para ±5 ppm |
Para ±2 ppm |
Aceitação |
|---|---|---|---|
Multicast de radiodifusão (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 laboratorial |
— |
30 min |
1+ hora |
Exemplos:
# 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
Se o mesmo fluxo for analisado em várias janelas curtas e o valor da deriva oscilar de uma janela para outra mais do que alguns ppm, a causa é o jitter de entrega (o ritmo de envio do emissor ou a rede), e não o relógio do codificador. Nesse caso, aumente a janela.
Códigos de saída¶
Código |
Significado |
|---|---|
|
Análise concluída, OVERALL = PASS |
|
Erro de argumentos ou da entrada |
|
Não há dados de PCR no fluxo |
|
A duração do fluxo é inferior ao mínimo de 2 s, ou nenhum dado foi recebido (a fonte não está transmitindo, endereço incorreto, associação multicast não efetuada, firewall ou interface incorreta; o analisador imprime uma dica) |
|
Análise concluída, OVERALL = FAIL — violação da TR 101 290 / ISO 13818-1 |
|
Interrompido por SIGINT (Ctrl+C) — a análise é cancelada, nenhum relatório é gerado |
|
Interrompido por SIGTERM — a análise é cancelada, nenhum relatório é gerado |
O código 65 corresponde a EX_DATAERR do POSIX <sysexits.h>: «os dados de entrada estão incorretos». Use-o em CI / monitoramento como critério de conformidade do fluxo:
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
}
Os códigos 130/143 seguem a regra do shell POSIX 128 + signal_number, portanto $? após Ctrl+C coincide com o que o bash retorna para qualquer processo encerrado pelo sinal SIGINT/SIGTERM. Ao ser interrompido, o analisador imprime uma única linha em stderr (Analysis interrupted by signal N — no report produced.) e não gera o relatório.
Exemplo de saída¶
Relatório completo (trecho)¶
========================================================================
MPEG-TS ANALYZER v2.4 — TR 101 290 FULL REPORT
Perfect Streamer Toolkit https://meshwork.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
========================================================================
Relatório resumido¶
MPEG-TS Analyzer v2.4 | Perfect Streamer Toolkit https://meshwork.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
Notas¶
Modo de arquivo: a deriva do PCR, o modelo de buffers T-STD e o UDP IAT não são medidos, porque exigem uma referência de tempo real. As demais verificações funcionam em ambos os modos.
Um único fluxo de transporte: é analisado um MPTS ou SPTS por vez.