06-03-01 Ремультиплексирование без перекодирования, с минимальными потерями качества

Что такое ремультиплексирование (remux)
Ремультиплексирование — это процесс извлечения медиапотоков из одного контейнера (формата) и упаковки их в другой без изменения содержимого видеопотока или аудиопотока. При этом кодеки остаются неизменными, как и сама медиаданные: ни видео, ни аудио не перекодируются. Это не конвертация, а именно переупаковка.
Такой подход часто называют copy-режимом, потому что в терминах FFMPEG мы используем опцию -c copy, которая указывает утилите копировать потоки «как есть», минуя этап декодирования и кодирования.
Примеры команд ремультиплексирования
Рассмотрим два типичных сценария использования ремультиплексирования в сетевых видеосистемах:
ffmpeg -i rtsp://192.168.1.100:554/stream1 -c copy -f flv rtmp://server/live/cam1
Что делает команда: принимает поток по RTSP с IP-камеры и отправляет его по RTMP на сервер, не перекодируя.
ffmpeg -i rtsp://192.168.1.100:554/stream1 -c copy -f mpegts "udp://239.1.1.1:1234"
Что делает команда: перенаправляет RTSP-поток в виде UDP-трансляции с использованием формата MPEG-TS.
Эти команды — основа быстрого и эффективного перенаправления видеопотоков в реальном времени.
Когда возможно ремультиплексирование
Ремультиплексирование не всегда возможно. Оно требует выполнения нескольких условий:
- Кодеки входного потока должны поддерживаться выходным форматом (контейнером)
Например, формат FLV (часто используемый в RTMP) поддерживает H.264 и AAC. Если камера отправляет H.265 (HEVC), то FLV не сможет его принять, и-c copyне сработает. - Контейнер должен допускать такую структуру потоков
Например, некоторые форматы не поддерживают определённые типы аудио (например, AC3 в FLV), или требуют определённой структуры метаданных. - Поток должен быть стабильным и корректно упакованным
Некоторые RTSP-потоки могут иметь нестандартные временные метки (PTS/DTS) или отсутствие ключевых кадров — это может нарушить процесс ремультиплексии.
Таблица: совместимость кодеков и форматов
| Контейнер (формат вывода) | Поддерживаемые видео-кодеки | Поддерживаемые аудио-кодеки | Примечания |
|---|---|---|---|
| FLV (RTMP) | H.264, VP6 | AAC, MP3, PCM | HEVC, AV1 — не поддерживаются |
| MPEG-TS (UDP, SRT) | H.264, H.265, MPEG-2 | AAC, MP3, AC3, PCM | Широко используется в вещании |
| MP4 | H.264, H.265, AV1 | AAC, MP3, AC3, FLAC | Требует завершённого файла для корректного воспроизведения |
| HLS (.m3u8 + .ts) | H.264, H.265 | AAC, MP3 | Сегменты должны быть самодостаточными |
⚠️ Если кодек на входе не поддерживается на выходе — FFMPEG выдаст ошибку вида:
Could not write header for output file #0 (incorrect codec parameters ?)
Преимущества ремультиплексирования
Ремультиплексирование — это наиболее эффективный способ перенаправления видеопотоков. Вот почему:
1. Минимальная нагрузка на процессор (CPU)
Поскольку не происходит перекодирования, FFMPEG не использует ресурсоёмкие операции, связанные с кодированием (например, DCT, квантование, motion estimation). Это особенно важно при работе с множеством камер или на слабых устройствах (например, встраиваемых системах или edge-серверах).
- При
-c copyзагрузка CPU может быть менее 5%. - При перекодировании — от 20% до 100% на поток, в зависимости от разрешения и настроек.
2. Практически нулевая дополнительная задержка
Поскольку не используется буферизация, связанная с кодированием, задержка, вносимая FFMPEG, минимальна. Основная задержка остаётся только от:
- Сетевого соединения с камерой (RTSP),
- Внутренних буферов сокета,
- Времени обработки пакетов.
Типичная дополнительная задержка при ремультиплексии — 10–50 мс, что почти незаметно.
3. Сохранение исходного качества
Видео и аудио не пережимаются, не теряют битрейт и не получают артефактов перекодирования. Это критично, например, в системах видеонаблюдения, где важно сохранить детализацию.
Ограничения ремультиплексирования
Несмотря на все преимущества, у режима -c copy есть серьёзные ограничения:
1. Нельзя изменить разрешение видео
Если камера передаёт 4K, а вам нужно 720p — это невозможно без перекодирования. Ремультиплексия только копирует поток, поэтому разрешение остаётся исходным.
2. Нельзя изменить битрейт
Битрейт также остаётся тем же. Если камера использует переменный битрейт (VBR) до 8 Мбит/с, вы не сможете «сжать» его до 2 Мбит/с, не перекодировав.
3. Нельзя изменить формат кадра
Например:
- Нельзя превратить чересстрочный (interlaced) поток в прогрессивный.
- Нельзя изменить частоту кадров (FPS).
- Нельзя добавить или изменить аудиодорожку.
4. Нельзя добавить графику, титры или оверлеи
Хотите наложить логотип, дату или текст «LIVE»? Это требует декодирования и повторного кодирования. При -c copy такие операции невозможны.
Почему это — базовый инструмент для рестриминга
Ремультиплексия — это фундаментальный инструмент в арсенале видеоинженера. Она используется в самых разных сценариях:
- IP-видеонаблюдение: RTSP-потоки с камер → FFMPEG → RTMP/HLS для просмотра в браузере.
- Студийные системы: перенос сигнала между оборудованием через SRT или UDP.
- CDN-трансляции: быстрое перенаправление потока на внешние платформы (YouTube, Twitch).
- Архивация: запись «сырого» потока с камеры в файл без потерь.
💡 Аналогия: представьте, что вы перекладываете книгу из одной коробки в другую, не открывая и не переписывая текст. Вы просто меняете упаковку. Это и есть ремультиплексирование.
Заключение
Ремультиплексирование с использованием -c copy — это быстрый, эффективный и безопасный способ перенаправления видеопотоков. Он позволяет:
- Минимизировать нагрузку на CPU,
- Сохранить качество,
- Уменьшить задержку.
Однако его возможности ограничены: нет изменения разрешения, битрейта, формата или графики. Поэтому ремультиплекция — это первая ступень в обработке потоков. Когда требуются изменения — приходится переходить к транскодированию, что мы рассмотрим в следующем разделе.