Monitoramento da fonte SDI¶
media.probe.sdi
O Sapsan monitora a fonte SDI durante a captura: verifica o estado do sinal, a sequência de quadros e o timecode e contabiliza os erros informados pelo driver da placa. Isso permite distinguir problemas da fonte e do cabo, mudanças de padrão de vídeo e perdas no caminho entre a placa e o pipeline de mídia.
A página Captura SDI descreve a conexão e a captura. Esta página trata do diagnóstico de uma entrada já configurada. A análise ocorre no pipeline em operação; não é necessário um processo separado que abra a mesma porta da placa.
O que é verificado em cada quadro¶
O driver entrega ao Sapsan o quadro de vídeo e os dados associados. A entrada compara esses dados com o estado da captura:
- Estado da linha — se há sinal e se ele corresponde ao formato da captura. O estado atual é verificado continuamente; assim, uma notificação perdida de recuperação do sinal não deve manter a entrada no estado anterior.
- Sequência de quadros — lacunas nos números dos buffers da placa indicam quadros perdidos antes de chegarem ao Sapsan. A lacuna também é considerada nas linhas do tempo de vídeo e áudio.
- CRC das linhas SDI — os erros dos metadados dos quadros são somados quando a placa e o driver oferecem essa verificação.
- Timecode ATC — com
timecodeativado, são verificadas a validade da hora do dia e a coerência de seu avanço com a sequência de quadros. - Dados auxiliares — são contabilizados os pacotes VANC reconhecidos e os erros no processamento dos dados suportados. As possibilidades de extração são descritas em captura SDI.
O recebimento de buffers da placa, por si só, não comprova a presença de um sinal útil. Se o cabo for desconectado, o driver pode continuar entregando quadros com um indicador de erro. O Sapsan considera esse indicador para que a entrada não pareça estar funcionando apenas porque o número de quadros continua aumentando.
Estado da linha e recuperação¶
A entrada V4L2 atual produz três estados:
ok— o quadro recebido não apresenta indicador de erro de linha. Isso não avalia o conteúdo da imagem ou do áudio.no_signal— o driver informa a ausência de sinal.wrong_standard— há sinal, mas o quadro está marcado com erro em relação ao formato atual da captura.
Para evitar reações a mudanças breves, a entrada espera 500 ms de estado de erro contínuo antes de interromper o envio de quadros ao pipeline de mídia. Se wrong_standard persistir por 2 segundos, a captura é reaberta. Um evento de mudança de sinal enviado pelo driver pode provocar um reinício antes disso quando o padrão é detectado automaticamente.
Na ausência de quadros, a captura é reiniciada após peer_timeout_ms. Durante a detecção automática do formato, a entrada já mostra no_signal enquanto espera pelo sinal; se ele não aparecer dentro desse prazo, a tentativa de abertura termina em falha. Quando standard é definido explicitamente, essa etapa de espera é ignorada. O padrão de peer_timeout_ms é 30 000 ms. O mecanismo geral de LSI gerencia novas tentativas e a comutação para a reserva; seu tempo de comutação não é igual à espera de 500 ms.
As mudanças de padrão e os reinícios de captura são contabilizados separadamente das falhas da fonte. Um aumento do contador de reinícios após a troca de sinal em um roteador exige uma interpretação diferente de um aumento causado pela ausência de quadros.
Verificação da linha do tempo e do timecode¶
A linha do tempo de vídeo é construída a partir da sequência de quadros e da taxa fracionária exata do formato. A linha do tempo de áudio considera o número de amostras. Com timecode ativado, a entrada analisa o ATC e pode associar ambas as linhas do tempo ao horário da fonte. A data vem do relógio do servidor, pois o ATC contém a hora do dia.
Exemplo de configuração pela API do central:
streams:
- name: studio
inputs:
- sdi:
device: /dev/v4l/by-path/pci-0000:5e:00.0-video-index0
timecode: true
peer_timeout_ms: 30000
timecode é ativado por padrão. Com false, a captura continua funcionando, mas o ATC não controla a linha do tempo e essas verificações de timecode não são executadas.
A associação exige um timecode válido:
- Hora do dia — a diferença em relação ao relógio do servidor não pode ultrapassar 30 segundos. O relógio do servidor deve estar sincronizado; um contador desde o início do material ou um timecode em outro fuso horário pode ser rejeitado.
- Taxa fracionária — 29,97 e 59,94 exigem drop-frame; o timecode a 23,98 não é usado nessa associação.
- Sequência — o timecode deve avançar de forma coerente com os quadros. Um desvio isolado não altera a linha do tempo; um novo deslocamento estável durante aproximadamente um segundo de quadros provoca uma nova associação.
Antes da primeira associação bem-sucedida, é usada uma linha do tempo sem ATC, posteriormente alinhada ao relógio do servidor. Após a associação, a ausência do timecode ou sua rejeição na verificação preserva o deslocamento anterior. Uma nova associação informa ao pipeline de mídia uma descontinuidade na linha do tempo para que o empacotamento posterior considere a mudança de horário.
| Contador de timecode | Significado |
|---|---|
timecode_missing |
Quadros sem ATC após uma associação bem-sucedida. Antes da associação, a ausência permanente de ATC não incrementa esse contador. |
timecode_rejected |
Timecode inválido ou incoerente: valor corrompido, modo de taxa inadequado, congelamento ou diferença instável. |
timecode_untrusted |
Timecode fora da janela de confiança em relação ao relógio do servidor. |
timecode_jumps |
Novas associações a um novo deslocamento estável. |
Estatísticas pela API¶
Consulte as estatísticas detalhadas no streamer que captura o SDI:
curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
http://streamer:8080/streamer/api-v4/streams/stats/studio \
| jq '{name, inputs: [(.inputs // [])[] | select(.protocol == "sdi")], input}'
inputs é a lista de fontes. As seguintes informações estão disponíveis para uma fonte SDI:
| Campo | Como interpretar |
|---|---|
current, status, failure_cause, error |
Se a fonte está selecionada, seu estado geral e o motivo da falha. |
sdi_line_state |
Estado da linha como string; o valor ok pode ser omitido no JSON. |
sdi_producer_restarts_total |
Reinícios acumulados da captura. O nome histórico producer não significa um processo separado de captura. |
sdi_boundary_loss_total |
Perdas identificadas por lacunas nos números dos buffers da placa. |
sdi_capture |
Formato de captura aceito pelo driver, antes da transcodificação. |
sdi_capture contém as dimensões do quadro, o FourCC numérico pixel_format, o número de bytes por linha stride e a taxa de quadros completos fps_num / fps_den. O campo opcional video_bytes_per_second estima o tráfego mínimo de vídeo por DMA em bytes por segundo, sem áudio nem sobrecarga de PCIe.
Na seção input do stream, o campo sdi_datagrams_total conta os quadros recebidos do dispositivo. Apesar do nome, não é uma contagem de datagramas de rede. Campos zerados podem estar ausentes. A ausência de uma seção de estatísticas não deve ser interpretada como uma medição realizada sem erros.
As estatísticas compactas do central contêm o estado das fontes, mas não substituem a resposta detalhada do streamer. O CRC e todos os contadores de timecode não são apresentados na API em um único objeto input.sdi; para eles, use a exportação de métricas.
Métricas e medições de tempo¶
A exportação do streamer está disponível em /streamer/api-v4/live-metrics, com autenticação. A disponibilidade da exportação e dos detalhes depende da licença de contadores.
curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
http://streamer:8080/streamer/api-v4/live-metrics \
| rg '^stream_input_sdi_.*stream="studio"'
| Série Prometheus | Significado |
|---|---|
stream_input_sdi_line_state |
Estado atual: 0 — ok, 1 — no_signal, 2 — wrong_standard. |
stream_input_sdi_datagrams_total |
Quadros recebidos do dispositivo. |
stream_input_sdi_boundary_loss_total |
Quadros perdidos segundo os números dos buffers. |
stream_input_sdi_crc_errors_total |
Erros de CRC das linhas informados pela placa. |
stream_input_sdi_producer_restarts_total |
Todos os reinícios da captura. |
stream_input_sdi_producer_restarts_wrong_standard_total |
Reinícios por padrão ou evento de mudança de sinal. |
stream_input_sdi_producer_restarts_silence_total |
Reinícios por ausência de quadros do dispositivo. |
stream_input_sdi_timecode_missing_total |
ATC ausente após a associação. |
stream_input_sdi_timecode_rejected_total |
ATC rejeitado. |
stream_input_sdi_timecode_untrusted_total |
ATC fora da janela de confiança do relógio. |
stream_input_sdi_timecode_jumps_total |
Novas associações da linha do tempo pelo ATC. |
O vocabulário geral de estados da linha também contém late, duplicate e invalid; a entrada V4L2 atual não os detecta como três tipos independentes de defeito do sinal. Para alguns contadores, a série aparece apenas após um evento; portanto, sua ausência não comprova que a placa ofereça suporte à verificação.
Além disso, o monitor geral da linha do tempo compara o horário de chegada da mídia com o DTS antes do alinhamento dos timestamps. As estatísticas do stream contêm os campos source_timing_offset_ms e source_timing_jitter_ms, além dos limites source_timing_offset_min_ms / source_timing_offset_max_ms. source_timing_offset_ms mostra o deslocamento atual; o jitter e os limites do deslocamento se referem à janela de um minuto concluída. source_timing_input e source_timing_window_started_at indicam a fonte e o início da janela.
Essas medições ajudam a identificar mudanças de atraso e irregularidades na chegada da mídia ao pipeline de software. Elas não medem o jitter elétrico do SDI. A verificação quadro a quadro também não significa que a API forneça o histórico de cada timestamp: são disponibilizados o estado e os resultados agregados.
Como interpretar os resultados¶
| Observação | O que verificar |
|---|---|
no_signal |
A fonte, o cabo, as conexões e a entrada selecionada da placa. |
| Aumentam os reinícios por padrão | Trocas de fonte, o formato detectado automaticamente e o standard definido explicitamente. |
| Aumentam os reinícios por ausência de quadros | O driver e a operação da captura; compare os eventos com os logs do servidor. |
Aumenta boundary_loss |
Perdas identificadas pelos números dos buffers: a carga do servidor e a capacidade do pipeline de receber os quadros da placa a tempo. O contador, por si só, não determina a causa das perdas. |
Aumenta crc_errors |
A integridade do sinal de entrada segundo os dados da placa. O valor zero não confirma a ausência de erros se a placa não informar CRC. |
Aumenta timecode_untrusted |
A sincronização do relógio do servidor e a finalidade do timecode da fonte. |
Aumentam timecode_rejected ou timecode_jumps |
A configuração e a estabilidade do gerador ATC e as trocas de fonte. |
Compare o aumento dos contadores ao longo de um intervalo, e não apenas o valor acumulado. Relacione o estado da linha ao recebimento real de quadros: zero perdas com a entrada parada não significa um sinal em boas condições.
O diagnóstico depende dos dados fornecidos pelo driver. Os indicadores descritos não medem o jitter elétrico do SDI, a amplitude nem o diagrama de olho. Essas medições exigem um analisador físico de sinal. O controle de ATC também não verifica congelamento da imagem nem silêncio no áudio.
Para captura de alta velocidade, considere separadamente os requisitos de 12G-SDI para o servidor e a memória. O formato de captura e as perdas do lado da placa devem ser avaliados antes da transcodificação: reduzir o bitrate de saída não reduz o volume de dados não comprimidos da entrada.