Контроль SDI-источника¶
media.probe.sdi
Sapsan контролирует SDI-источник во время захвата: проверяет состояние сигнала, последовательность кадров и таймкод, учитывает ошибки, переданные драйвером карты. Это позволяет различать проблемы источника и кабеля, смену видеостандарта и потери на пути от карты до медиапайплайна.
Приём SDI описывает подключение и захват. Эта статья посвящена диагностике уже настроенного входа. Анализ выполняется в работающем тракте; отдельный процесс, открывающий тот же порт карты, для него не требуется.
Что проверяется на каждом кадре¶
Драйвер передаёт Sapsan видеокадр и сопутствующие данные. Вход сопоставляет их с состоянием захвата:
- Состояние линии — есть ли сигнал и соответствует ли он формату захвата. Проверяется уровень состояния, поэтому пропущенное уведомление о восстановлении сигнала не должно оставлять вход в прежнем состоянии.
- Последовательность кадров — пропуски в номерах буферов карты показывают кадры, потерянные до получения их Sapsan. Разрыв учитывается и во временной шкале видео и звука.
- CRC строк SDI — ошибки из метаданных кадра суммируются, если карта и драйвер предоставляют такую проверку.
- Таймкод ATC — при включённом
timecodeпроверяются пригодность времени суток и согласованность его движения с последовательностью кадров. - Вспомогательные данные — учитываются распознанные VANC-пакеты и ошибки обработки поддерживаемых данных. Возможности их извлечения описаны в приёме SDI.
Поступление буферов от карты само по себе не доказывает наличие полезного сигнала. При обрыве кабеля драйвер может продолжать отдавать кадры с признаком ошибки. Sapsan учитывает этот признак, чтобы такой вход не выглядел исправным только из-за растущего числа кадров.
Состояние линии и восстановление¶
Текущий V4L2-вход формирует три состояния:
ok— у полученного кадра нет признака ошибки линии. Это не оценка содержимого изображения или звука.no_signal— драйвер сообщает об отсутствии сигнала.wrong_standard— сигнал присутствует, но кадр помечен ошибкой относительно текущего формата захвата.
Для защиты от кратковременных изменений вход выдерживает 500 мс непрерывного состояния ошибки, прежде чем прекратить передачу кадров в медиапайплайн. При устойчивом wrong_standard через 2 секунды захват открывается заново. Событие смены сигнала от драйвера может вызвать перезапуск раньше, если стандарт определяется автоматически.
При отсутствии кадров захват перезапускается по peer_timeout_ms. При автоматическом определении формата вход показывает no_signal уже во время ожидания сигнала; если сигнал не появился за этот таймаут, попытка открытия завершается отказом. При явно заданном standard этот этап ожидания пропускается. По умолчанию peer_timeout_ms равен 30 000 мс. Общий механизм LSI управляет повторными попытками и переходом на резерв; его время переключения не равно выдержке 500 мс.
Смена стандарта и перезапуск захвата учитываются отдельно от отказов источника. Рост счётчика перезапусков после переключения сигнала на роутере требует иной интерпретации, чем рост перезапусков из-за отсутствия кадров.
Проверка временной шкалы и таймкода¶
Временная шкала видео строится по последовательности кадров и точной дробной частоте формата. Звуковая шкала учитывает число аудиосэмплов. При включённом timecode вход анализирует ATC и может привязать обе шкалы ко времени источника. Дата берётся с часов сервера, поскольку ATC содержит время суток.
Пример настройки через API 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 включён по умолчанию. При false захват продолжает работать, но ATC не управляет шкалой и эти проверки таймкода не выполняются.
Для привязки требуется пригодный таймкод:
- Время суток — расхождение с часами сервера не больше 30 секунд. Часы сервера должны быть синхронизированы; счётчик от начала материала или таймкод в другом часовом поясе может быть отвергнут.
- Дробная частота — для 29,97 и 59,94 требуется drop-frame; таймкод на 23,98 не используется для такой привязки.
- Последовательность — таймкод должен двигаться согласованно с кадрами. Единичное отклонение не меняет шкалу; устойчивый новый сдвиг примерно в течение секунды кадров вызывает перепривязку.
До первой успешной привязки используется шкала без ATC с последующим выравниванием по часам сервера. После привязки пропажа или отказ проверки таймкода сохраняет прежний сдвиг. Перепривязка сообщает медиапайплайну о разрыве шкалы, чтобы последующая упаковка учла изменение времени.
| Счётчик таймкода | Значение |
|---|---|
timecode_missing |
Кадры без ATC после успешной привязки. До привязки постоянное отсутствие ATC не увеличивает этот счётчик. |
timecode_rejected |
Непригодный или несогласованный таймкод: повреждённое значение, неподходящий режим частоты, замирание либо неустойчивое расхождение. |
timecode_untrusted |
Таймкод вне окна доверия относительно часов сервера. |
timecode_jumps |
Перепривязки к устойчивому новому сдвигу. |
Статистика через API¶
Подробную статистику запрашивайте у стримера, который захватывает 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 — список источников. У SDI-источника доступны следующие сведения:
| Поле | Как читать |
|---|---|
current, status, failure_cause, error |
Выбран ли источник, его общее состояние и причина отказа. |
sdi_line_state |
Состояние линии строкой; значение ok может быть опущено в JSON. |
sdi_producer_restarts_total |
Накопленные перезапуски захвата. Историческое имя producer не означает отдельный процесс захвата. |
sdi_boundary_loss_total |
Потери по пропускам в номерах буферов карты. |
sdi_capture |
Принятый драйвером формат захвата до транскодирования. |
В sdi_capture находятся размеры кадра, числовой FourCC pixel_format, число байтов в строке stride и частота полных кадров fps_num / fps_den. Необязательное video_bytes_per_second оценивает минимальный поток видеоданных DMA в байтах в секунду, без звука и накладных расходов PCIe.
В секции input на уровне стрима поле sdi_datagrams_total считает полученные от устройства кадры. Несмотря на имя, это не число сетевых датаграмм. Нулевые поля могут отсутствовать. Отсутствие секции со статистикой нельзя интерпретировать как выполненное измерение без ошибок.
Компактная статистика central содержит состояние источников, но не заменяет подробный ответ стримера. CRC и все счётчики таймкода не представлены в API единым объектом input.sdi; для них используйте экспорт метрик.
Метрики и временные измерения¶
Экспорт стримера доступен по адресу /streamer/api-v4/live-metrics с авторизацией. Доступность экспорта и детализации зависит от лицензии на счётчики.
curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
http://streamer:8080/streamer/api-v4/live-metrics \
| rg '^stream_input_sdi_.*stream="studio"'
| Серия Prometheus | Значение |
|---|---|
stream_input_sdi_line_state |
Текущее состояние: 0 — ok, 1 — no_signal, 2 — wrong_standard. |
stream_input_sdi_datagrams_total |
Полученные кадры устройства. |
stream_input_sdi_boundary_loss_total |
Потерянные кадры по номерам буферов. |
stream_input_sdi_crc_errors_total |
Ошибки CRC строк, сообщённые картой. |
stream_input_sdi_producer_restarts_total |
Все перезапуски захвата. |
stream_input_sdi_producer_restarts_wrong_standard_total |
Перезапуски из-за стандарта или события смены сигнала. |
stream_input_sdi_producer_restarts_silence_total |
Перезапуски из-за отсутствия кадров от устройства. |
stream_input_sdi_timecode_missing_total |
Пропавший после привязки ATC. |
stream_input_sdi_timecode_rejected_total |
Отвергнутый ATC. |
stream_input_sdi_timecode_untrusted_total |
ATC вне окна доверия к часам. |
stream_input_sdi_timecode_jumps_total |
Перепривязки шкалы по ATC. |
Общий словарь состояния линии содержит также late, duplicate и invalid; текущий V4L2-вход не обнаруживает их как три самостоятельных вида дефекта сигнала. У отдельных счётчиков серия появляется только после события, поэтому отсутствие серии не подтверждает поддержку проверки картой.
Дополнительно общий монитор временной шкалы сравнивает время поступления медиа с DTS перед выравниванием временной шкалы. Статистика стрима содержит поля source_timing_offset_ms и source_timing_jitter_ms, а также границы source_timing_offset_min_ms / source_timing_offset_max_ms. source_timing_offset_ms показывает текущее смещение; джиттер и границы смещения относятся к завершённому минутному окну. source_timing_input и source_timing_window_started_at указывают источник и начало окна.
Эти измерения помогают увидеть изменение отставания и неравномерность поступления медиа в программный тракт. Они не измеряют электрический джиттер SDI. Покадровая проверка также не означает, что API выгружает историю каждой временной метки: наружу выдаются состояние и агрегированные результаты.
Как читать результаты¶
| Наблюдение | Что проверять |
|---|---|
no_signal |
Источник, кабель, коммутацию и выбранный вход карты. |
| Растут перезапуски по стандарту | Переключения источника, автоматически определяемый формат и явно заданный standard. |
| Растут перезапуски по отсутствию кадров | Драйвер и работу захвата; сопоставьте события с логами сервера. |
Растёт boundary_loss |
Потери по номерам буферов: нагрузку сервера и способность тракта вовремя принимать кадры от карты. Сам счётчик не определяет причину потерь. |
Растёт crc_errors |
Целостность входного сигнала по данным карты. Нулевое значение не подтверждает отсутствие ошибок, если карта не предоставляет CRC. |
Растёт timecode_untrusted |
Синхронизацию часов сервера и назначение таймкода источника. |
Растут timecode_rejected или timecode_jumps |
Настройку и стабильность генератора ATC, переключения источников. |
Сравнивайте прирост счётчиков за интервал, а не только накопленное значение. Состояние линии сопоставляйте с фактическим поступлением кадров: ноль потерь при остановленном входе не означает исправный сигнал.
Диагностика зависит от данных, которые предоставляет драйвер. Описанные показатели не являются измерением электрического джиттера SDI, амплитуды или глазковой диаграммы. Для таких измерений нужен анализатор физического сигнала. Контроль ATC также не является проверкой изображения на стоп-кадр или звука на тишину.
Для высокоскоростного захвата отдельно учитывайте требования 12G-SDI к серверу и памяти. Формат захвата и потери на стороне карты нужно оценивать до транскодирования: уменьшение выходного битрейта не уменьшает объём входных несжатых кадров.