RTMP — классический протокол для CDN и стриминговых платформ

RTMP (Real-Time Messaging Protocol) — один из старейших и наиболее устоявшихся протоколов для передачи потокового видео и аудио в режиме реального времени. Несмотря на свою возрастную архитектуру, RTMP продолжает широко использоваться в современных видеосистемах, особенно при публикации стримов на популярные платформы, такие как YouTube, Twitch, а также на локальные медиасерверы. В этом разделе мы рассмотрим, как FFMPEG работает с RTMP, какие команды используются, и на что влияют ключевые параметры при настройке трансляции.
Команда публикации на RTMP-сервер
Рассмотрим типичную команду FFMPEG для отправки видеофайла в RTMP-сервер:
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://server/app/stream
Эта команда означает следующее:
-re— читать входной файл в реальном времени (realtime).-i input.mp4— указывает на источник: видеофайл на диске.-c:v libx264— кодировать видео с помощью кодека H.264.-preset veryfast— ускорить кодирование за счёт небольшого снижения эффективности сжатия.-c:a aac— кодировать аудио в формате AAC.-f flv— задать формат выходного контейнера как FLV.rtmp://server/app/stream— адрес назначения, где:server— IP или доменное имя сервера,app— приложение (например,live),stream— имя потока.
Такая команда часто используется для тестирования, демонстрации или подготовки трансляции из записанного файла.
Зачем нужен флаг -re?
Когда FFMPEG читает видео из файла, по умолчанию он обрабатывает его максимально быстро — то есть декодирует и отправляет поток в выходной протокол без учёта временных меток. Это может привести к тому, что весь файл будет «залит» на сервер за несколько секунд, что:
- перегружает RTMP-сервер,
- вызывает ошибки буферизации у клиентов,
- нарушает синхронизацию аудио и видео.
Флаг -re эмулирует реальное время воспроизведения. FFMPEG будет читать кадры с той же скоростью, с которой они были записаны — например, 25 или 30 кадров в секунду. Это критически важно при публикации файлов в потоковые платформы, чтобы избежать «засыпания» сервера и обеспечить плавный приём у зрителей.
Пример: если у вас 10-минутный файл, с
-reон будет отправляться ровно 10 минут. Без-re— за 1–2 секунды.
Контейнер FLV как обёртка для RTMP
RTMP изначально разрабатывался компанией Adobe для Flash-плееров, и его естественным контейнером является FLV (Flash Video). FFMPEG использует FLV как формат упаковки видео и аудио потоков при отправке по RTMP.
Ключевые особенности FLV:
- Поддерживает H.264 и AAC — основные кодеки для стриминга.
- Имеет минимальные накладные расходы.
- Не поддерживает современные кодеки, такие как H.265 или AV1.
- Структура позволяет передавать данные потоком, без предварительного чтения всего файла.
Поэтому, даже если исходный файл — MP4, FFMPEG перепаковывает его в FLV при отправке по RTMP. Это делается автоматически, если указан -f flv.
Важно: несмотря на устаревшее происхождение, FLV остаётся актуальным именно в контексте RTMP. Современные RTMP-серверы (например, nginx-rtmp, Wowza, OBS) корректно обрабатывают FLV-потоки.
Типичный пайплайн: от камеры до CDN
На практике RTMP редко используется как конечная цель. Чаще он выступает транзитным протоколом в цепочке доставки видео. Типичная схема выглядит так:
IP-камера → FFMPEG (транскодирование/ремультиплексирование) → RTMP → CDN (YouTube, Twitch, локальный сервер) → Зрители
Примеры использования:
-
Онлайн-трансляция с камеры
Камера выдаёт RTSP-поток. FFMPEG принимает его, перекодирует (если нужно) и отправляет в YouTube через RTMP:ffmpeg -i rtsp://camera_ip:554/stream -c:v libx264 -preset veryfast -c:a aac -f flv rtmp://a.rtmp.youtube.com/live2/your-key -
Студийная трансляция
FFMPEG комбинирует несколько источников (камеры, экран, аудио) и отправляет итоговый поток в Twitch. -
Локальный медиасервер
RTMP-потоки собираются на внутренний сервер (например, с помощью nginx-rtmp), а затем перераздаются в HLS или SRT.
RTMP здесь играет роль унифицированного входного интерфейса, который понимают почти все стриминговые платформы.
Задержка при использовании RTMP
Одно из главных ограничений RTMP — недостаточная оптимизация по задержке, особенно при использовании через публичные CDN.
Где возникает задержка?
| Этап | Источник задержки |
|---|---|
| FFMPEG | Буферы ввода, кодирования, мультиплексации |
| RTMP-сервер | Внутренние буферы, балансировка, ретрансляция |
| CDN | Кэширование, сегментация, географическое распределение |
| Клиент | Буферизация плеера для стабильности воспроизведения |
Общая задержка может составлять от 5 до 30 секунд, особенно при использовании YouTube или Twitch.
Как уменьшить задержку?
FFMPEG предоставляет ряд параметров для минимизации латентности:
-tune zerolatency— оптимизация кодера H.264 для минимальной задержки.-g 30— установка GOP (Group of Pictures) в 30 кадров (или меньше). Чем короче GOP, тем чаще ключевые кадры и тем быстрее можно начать воспроизведение.-bf 0— отключение B-кадров, которые требуют буферизации будущих кадров.-maxrate 3000k -bufsize 6000k— ограничение битрейта и размера буфера VBV (Video Buffering Verifier), что помогает избежать «всплесков» и переполнения.
Пример команды с низкой задержкой:
ffmpeg -re -i input.mp4 \
-c:v libx264 -preset veryfast -tune zerolatency \
-g 30 -bf 0 -maxrate 3000k -bufsize 6000k \
-c:a aac -b:a 128k \
-f flv rtmp://server/app/stream
Примечание: слишком агрессивное снижение задержки может ухудшить качество видео и стабильность потока, особенно при нестабильном соединении.
Почему RTMP всё ещё используется?
Несмотря на высокую задержку, RTMP остаётся популярным по нескольким причинам:
- Универсальность: почти все платформы принимают RTMP-вход.
- Простота настройки: легко интегрировать с FFMPEG, OBS, видеосерверами.
- Стабильность: хорошо работает по TCP, обеспечивает надёжную доставку.
- Поддержка транскодирования: сервер может перекодировать поток под разные параметры качества и форматы (HLS, DASH).
Однако для интерактивных сценариев (видеозвонки, вебинары с обратной связью, live-игры) RTMP не подходит из-за задержки. Здесь применяются более современные протоколы: SRT, WebRTC, CMAF.
Итоги
- RTMP — классический, но не оптимальный по задержке протокол для стриминга.
- FFMPEG использует FLV как контейнер при отправке по RTMP.
- Флаг
-reкритически важен при работе с файлами, чтобы избежать «заливки» сервера. - RTMP часто используется как входной протокол для CDN (YouTube, VK), но не как конечный формат доставки.
- Задержка зависит от множества факторов: буферов FFMPEG, настроек кодирования, политики сервера и CDN.
- Для снижения латентности применяют:
-tune zerolatency, короткий GOP, отключение B-кадров, управление буферами.
RTMP — это «рабочая лошадка» потокового видео, но не инструмент для ультранизкой задержки. В следующих разделах мы рассмотрим более современные альтернативы, такие как SRT и WebRTC, которые лучше подходят для интерактивных задач.