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
Разберём её по частям:
- Вход:
-i rtsp://...— FFMPEG подключается к IP-камере по протоколу RTSP и получает поток.
- Первый выход (трансляция):
-c:v libx264— видео перекодируется в H.264;-c:a aac— аудио перекодируется в AAC;-f flv— поток упаковывается в контейнер FLV;rtmp://...— отправляется на RTMP-сервер (например, YouTube, Twitch, внутренний медиасервер).
- Второй выход (локальная запись):
-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 здесь выступает не просто как конвертер, а как многопоточный медиашлюз, объединяющий разные миры: камеры, сети, архивы и платформы.