Перейти к основному содержимому

06-03-03 Множественные выходы: запись и трансляция

06-03-03

FFMPEG — не просто инструмент для перекодирования видео или аудио. Он способен одновременно выполнять несколько задач, в том числе запись одного и того же входного потока в разные выходы с различной обработкой. Это особенно важно в реальных видеосистемах, где часто требуется одновременно транслировать видео в сеть и сохранять его локально — например, для архивации, юридических целей или дальнейшего анализа.

Рассмотрим, как FFMPEG справляется с такой задачей, и разберём типичные сценарии её применения.


Как FFMPEG разветвляет медиапоток на несколько выходов

В отличие от простых утилит, которые могут работать только с одним выходом, FFMPEG поддерживает множественные выходы в одной команде. Это означает, что при одном запуске процесс может:

  • Принять один входной поток (например, с IP-камеры по RTSP);
  • Обработать его (декодировать, отфильтровать, перекодировать);
  • Отправить разные версии этого потока в разные места — например, в сеть и на диск.

Технически FFMPEG реализует это за счёт разделения графа обработки после декодирования. После того как входной поток демультиплексирован и декодирован, FFMPEG может направить копии видеоданных по независимым цепочкам обработки, каждая из которых может включать:

  • Собственные фильтры;
  • Собственное кодирование;
  • Свой контейнер и протокол вывода.

Каждый выход в команде описывается отдельной парой параметров кодека и назначения (-c:v, -c:a, -f, URL/путь). FFMPEG автоматически «размножает» поток и обрабатывает каждый выход независимо.


Пример команды с двумя выходами

Рассмотрим типичную команду:

ffmpeg -i rtsp://user:pass@192.168.1.100:554/stream1 \
-c:v libx264 -c:a aac -f flv rtmp://cdn.example.com/live/stream1 \
-c:v copy -c:a copy -f matroska local_record.mkv

Разберём её по частям:

  1. Вход:
    • -i rtsp://... — FFMPEG подключается к IP-камере по протоколу RTSP и получает поток.
  2. Первый выход (трансляция):
    • -c:v libx264 — видео перекодируется в H.264;
    • -c:a aac — аудио перекодируется в AAC;
    • -f flv — поток упаковывается в контейнер FLV;
    • rtmp://... — отправляется на RTMP-сервер (например, YouTube, Twitch, внутренний медиасервер).
  3. Второй выход (локальная запись):
    • -c:v copy — видео копируется без перекодирования;
    • -c:a copy — аудио копируется без перекодирования;
    • -f matroska — поток сохраняется в контейнер MKV;
    • local_record.mkv — файл записывается на локальный диск.

Разные стратегии обработки для разных выходов

Один из ключевых плюсов такого подхода — гибкость в выборе обработки для каждого выхода. В примере выше мы видим два принципиально разных подхода:

ВыходКодирование видеоКодирование аудиоКонтейнерНазначение
RTMP-трансляцияlibx264 (перекодировка)aac (перекодировка)FLVОптимизация под CDN и платформы
Локальная записьcopy (без перекодировки)copy (без перекодировки)MKVСохранение исходного качества

Зачем так делать?

  • Трансляция требует оптимизации под целевую платформу:
    • YouTube и Twitch принимают потоки в формате RTMP с контейнером FLV.
    • Они ожидают H.264 + AAC.
    • Исходный поток с камеры может использовать H.265 (HEVC), который не поддерживается RTMP-платформами.
    • Поэтому перекодировка необходима.
  • Архив должен быть максимально качественным и неизменным:
    • Перекодировка всегда вносит потерю качества.
    • Сохраняя поток с -c copy, мы получаем бит-в-бит точную копию исходного сигнала.
    • Это важно для:
      • Юридических доказательств;
      • Повторного анализа;
      • Возможности перекодировать позже с другими параметрами.

Практические кейсы использования множественных выходов

1. Онлайн-трансляция с одновременной записью архива

Сценарий: ведётся прямой эфир с конференции, но организаторы хотят сохранить полнокачественную копию для публикации в архиве.

  • FFMPEG принимает поток с камеры (RTSP);
  • Отправляет в RTMP на YouTube (с перекодировкой в H.264/AAC);
  • Параллельно сохраняет исходный поток в .mkv на SSD.

Преимущество: не нужно запускать два отдельных процесса, не нужно дублировать сетевое соединение — всё делается в одном FFMPEG.

2. Запись сигнала студийного пульта

Сценарий: в теле- или радиостудии используется пульт, который переключает между источниками (камеры, презентации, внешние сигналы). Сигнал с пульта передаётся как RTMP или SDI → IP.

  • FFMPEG принимает финальный сигнал с пульта;
  • Отправляет его в RTMP на CDN;
  • Одновременно записывает в локальный файл с -c copy.

Почему это важно: пульт — это уже «готовый продукт» с наложенными титрами, переходами, PIP. Сохраняя его без перекодировки, мы фиксируем точную копию того, что видели зрители, и можем использовать её как мастер-запись.

3. Мониторинг и аудит видеосистемы

Сценарий: в системе видеонаблюдения нужно:

  • Отправлять потоки в облачный VMS (видеоменеджер);
  • Хранить копии локально на случай потери интернета.

FFMPEG может:

  • Принимать RTSP с камеры;
  • Отправлять в RTMP/SRT в облако;
  • Писать .mkv на локальный NAS.

При этом даже при потере связи с облаком архив остаётся.


Важные технические нюансы

Порядок выходов имеет значение

FFMPEG обрабатывает выходы по порядку, и параметры кодеков и фильтров применяются к следующему выходу, пока не переопределены. Поэтому важно:

  • Не забывать указывать -c:v, -c:a и -f перед каждым выходом;
  • Использовать -map при сложных сценариях (например, если нужно взять разные потоки для разных выходов).

Ресурсы системы

Один FFMPEG-процесс с двумя выходами:

  • Одно соединение с источником — экономия сети;
  • Одно декодирование — экономия CPU;
  • Но два кодера, если оба выхода перекодируются — нагрузка возрастает.

В примере выше:

  • Для RTMP — требуется полное перекодирование (тяжело);
  • Для локальной записи — никакого кодирования (лёгкий путь).

Это оптимальная нагрузка: мы платим за кодирование только один раз.

Буферизация и задержка

FFMPEG старается синхронизировать выходы, но каждый из них имеет свои буферы:

  • Сетевой вывод (RTMP) — буферы протокола;
  • Локальная запись — буферы диска.

Обычно это не критично, но при строгих требованиях к синхронизации (например, для мультикамерной съёмки) может потребоваться дополнительная настройка.

::: warn Важно помнить, что отправка нескольких потоков через FFMPEG имеет и ограничения: вы не сможете, например, перезапустить один из потоков, если что-то пошло не так. С этим сталкиваются пользователи VMix: он умеет отправлять до трёх потоков на разные платформы с разными параметрами. Но, случись на какой-нибудь из платформ надобность перезапустить поток, сделать это, не останавливая остальные потоки, не получится.

:::


Заключение: гибкость FFMPEG в реальных задачах

Возможность одновременной записи и трансляции с разной обработкой — яркий пример того, как FFMPEG становится центральным элементом видеокомплекса. Он позволяет:

  • Экономить ресурсы (одно соединение, одно декодирование);
  • Гибко настраивать обработку под разные цели;
  • Сохранять качество архива, не жертвуя совместимостью трансляции.

Этот подход широко используется в:

  • Вещательных студиях;
  • Системах видеонаблюдения;
  • Онлайн-образовании;
  • Трансляциях спортивных и корпоративных мероприятий.

FFMPEG здесь выступает не просто как конвертер, а как многопоточный медиашлюз, объединяющий разные миры: камеры, сети, архивы и платформы.