SRT и UDP TS: надёжность vs задержка

В этой части лекции мы рассматриваем два подхода к передаче видеопотока по сети — SRT (Secure Reliable Transport) и UDP с MPEG-TS (MPEG-2 Transport Stream). Оба используются для передачи видео в реальном времени, но решают разные задачи: один делает упор на надёжность, другой — на минимальную задержку и простоту. FFMPEG позволяет легко работать с обоими, но выбор между ними зависит от требований к качеству, стабильности и латентности.
SRT: надёжная доставка с контролируемой задержкой
SRT — это современный протокол, разработанный для передачи потокового видео по ненадёжным сетям (включая интернет) с минимальными потерями и предсказуемой задержкой. Он сочетает в себе механизмы обратной связи, подтверждения доставки, восстановления потерянных пакетов и динамического управления буферами, что делает его идеальным для профессиональных видеопередач.
Примеры использования SRT в FFMPEG
Приём потока (режим listener):
ffmpeg -i "srt://192.168.1.100:1234?mode=listener" -c copy out.ts
Эта команда запускает FFMPEG в режиме слушателя (listener): он ожидает входящее SRT-соединение на указанном IP и порту. Как только отправитель подключится, FFMPEG начнёт принимать поток и записывать его в файл out.ts, не перекодируя (-c copy).
Отправка потока (режим caller):
ffmpeg -i input.ts -f mpegts "srt://192.168.1.100:1234?mode=caller&latency=120"
Здесь FFMPEG выступает в роли инициатора (caller). Он читает файл input.ts, упаковывает его в контейнер MPEG-TS (-f mpegts) и отправляет по SRT на указанный адрес. Параметр latency=120 задаёт целевую задержку в миллисекундах.
⚠️ Важно:
latencyв SRT — это не минимальная задержка, а максимальный буфер, который протокол может использовать для компенсации потерь и джиттера. Чем больше значение — тем устойчивее передача, но тем выше задержка.
Параметр latency: как он влияет на работу FFMPEG
Параметр latency в SRT — один из ключевых при настройке баланса между надёжностью и латентностью. Он определяет, сколько времени (в миллисекундах) SRT может «задерживать» поток, чтобы:
- обнаружить потерянные пакеты;
- запросить их повторную отправку (ARQ — Automatic Repeat reQuest);
- восстановить правильный порядок пакетов (reordering);
- сгладить сетевой джиттер.
Как это работает на практике:
- При
latency=120SRT резервирует буфер на ~120 мс.
→ Если пакет пришёл с опозданием, но в пределах этого окна — он будет восстановлен.
→ Если опоздал больше чем на 120 мс — считается потерянным. - При
latency=50задержка меньше, но и шанс восстановить пакет — ниже.
→ Подходит для стабильных сетей (LAN, выделенные каналы).
→ Не подходит для интернета с высоким джиттером. - FFMPEG автоматически интегрируется с этим буфером:
→ Входной буфер SRT становится частью общего буферного цикла FFMPEG.
→ Уменьшатьlatency— значит уменьшать запас на восстановление, но снижать общую задержку.
🔍 Совет: в реальных системах
latencyчасто устанавливают в диапазоне 120–500 мс в зависимости от качества канала. Для интернет-трансляций — 300–500 мс, для локальных сетей — 100–200 мс.
UDP с MPEG-TS: минимальные накладные расходы, но без гарантий
Альтернативой SRT является прямая передача потока через UDP в формате MPEG-TS:
ffmpeg -i input.ts -f mpegts udp://192.168.1.100:1234
Этот способ — один из самых лёгких и быстрых. UDP не требует установки соединения, не подтверждает доставку и не восстанавливает потерянные пакеты. MPEG-TS — стандартный контейнер, устойчивый к ошибкам: он позволяет декодеру продолжать работу даже при частичной потере данных.
Плюсы UDP + MPEG-TS:
- Минимальная задержка: нет буферов подтверждения, нет ARQ.
- Низкая нагрузка на CPU и сеть: нет шифрования, нет служебного трафика.
- Поддерживается большинством профессиональных устройств (видеомикшеры, рекордеры, мониторы).
Минусы:
- Нет гарантии доставки: потерянные пакеты — навсегда.
- Нет защиты от джиттера: при переменной задержке в сети возможны сбои.
- Требует стабильной сети и дополнительного запаса по джиттеру на стороне приёмника.
🎯 Пример: если в сети возможен джиттер до 50 мс, приёмник должен иметь буфер минимум на 50 мс, чтобы избежать сбоев. Это дополнительная задержка, которую инженер должен закладывать в систему.
Сравнение SRT и UDP TS: таблица различий
| Параметр | SRT | UDP + MPEG-TS |
|---|---|---|
| Гарантия доставки | Да (ARQ, восстановление пакетов) | Нет |
| Задержка | Контролируемая (100–500 мс) | Минимальная (1–10 мс + джиттер) |
| Нагрузка на сеть | Выше (служебный трафик, ACK) | Очень низкая |
| Устойчивость к потерям | Высокая | Низкая |
| Шифрование | Поддерживается (AES) | Нет (только при внешнем туннеле) |
| Типичное применение | Интернет, межстудийные линии | Локальные сети, SDI-over-IP |
Где реально используются эти схемы?
SRT — для «профессионального интернета»:
- Межстудийные передачи: трансляция с удалённой площадки в студию.
- Новостные репортажи: камера в поле → SRT → центр обработки.
- Рестриминг в CDN: FFMPEG принимает RTSP с камеры, перекодирует и отправляет через SRT на медиасервер.
- Удалённая работа с видеоматериалами: передача потока в редакцию для монтажа.
💡 SRT особенно ценен, когда нет выделенного канала, но нужна стабильность — например, при использовании 4G/5G.
UDP TS — для «студийной внутренней сети»:
- SDI-over-IP: замена коаксиальных кабелей на IP-сеть в телецентре.
- Межблочные соединения: передача сигнала между видеомикшером, рекордером, монитором.
- Тестовые генераторы: отправка эталонного потока для проверки оборудования.
- Синхронные многокамерные системы: когда все камеры и приёмники в одной локальной сети с гарантированной пропускной способностью.
📌 UDP TS — это «цифровой аналог SDI». Он работает быстро и предсказуемо, но только в контролируемой среде.
FFMPEG как переключатель между режимами
Один из главных плюсов FFMPEG — его гибкость. Вы можете легко переключаться между SRT и UDP TS, просто изменив URL вывода:
# Передача через SRT (надёжно, с задержкой)
ffmpeg -i rtsp://cam -c copy -f mpegts "srt://server:1234?mode=caller&latency=300"
# Передача через UDP (быстро, но без гарантий)
ffmpeg -i rtsp://cam -c copy -f mpegts udp://server:1234
Это позволяет:
- тестировать разные сценарии в одной инфраструктуре;
- использовать SRT для внешних соединений и UDP для внутренних;
- строить гибридные системы, где FFMPEG адаптирует поток под требования каждого участка сети.
Вывод: выбор зависит от контекста
- Нужна стабильность по интернету? → Используйте SRT с разумным
latency. - Работаете в локальной сети с гарантированным каналом? → Выбирайте UDP TS для минимальной задержки.
- Хотите баланс? → SRT в локальной сети тоже работает отлично, особенно если есть микросбои или джиттер.
FFMPEG не навязывает выбор — он предоставляет инструменты для реализации обоих подходов. Ваша задача как инженера — понимать, где уместна надёжность, а где важнее скорость, и грамотно настраивать параметры, особенно latency, чтобы не «перебуферизовать» систему.