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

06-03-02 Транскодирование: когда нужно менять кодек и качество

06-03-02

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

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


Зачем нужно транскодирование?

Транскодирование — это процесс изменения характеристик медиапотока на уровне видео- и аудиоданных, а не только их упаковки. Он используется, когда:

  1. Кодек на входе не поддерживается на выходе
    Например, IP-камера передаёт видео в H.265 (HEVC), но ваш CDN или медиасервер принимает только H.264. В этом случае без перекодирования не обойтись.
  2. Требуется уменьшить битрейт
    Камера может генерировать поток с битрейтом 10 Мбит/с, но канал связи или клиентское устройство (например, мобильный телефон) не справляются с таким объёмом данных. Транскодирование позволяет снизить нагрузку, перекодировав видео в более компактный формат.
  3. Нужно изменить разрешение
    Камера снимает в 4K, но для трансляции в интернет достаточно Full HD (1920×1080) или даже HD (1280×720). Уменьшение разрешения снижает битрейт и нагрузку на сеть.
  4. Требуется изменить частоту кадров
    Например, камера передаёт 30 кадров в секунду, но для архива или трансляции достаточно 15 или 25 кадров/с — это экономит место и полосу пропускания.
  5. Аудиоформат несовместим
    Камера может использовать G.711 или PCM, но RTMP-сервер ожидает AAC. В этом случае аудио также нужно перекодировать.

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

Рассмотрим типичную команду FFMPEG для полного транскодирования потока с IP-камеры:

ffmpeg -i rtsp://user:pass@192.168.1.100:554/stream1 \
-vf scale=1280:720 \
-c:v libx264 \
-preset veryfast \
-b:v 3M \
-c:a aac \
-f flv \
rtmp://server/live/stream1

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

Элемент командыНазначение
-i rtsp://...Входной поток с IP-камеры по протоколу RTSP
-vf scale=1280:720Фильтр масштабирования видео до разрешения 1280×720
-c:v libx264Кодек видео — H.264
-preset veryfastБаланс между скоростью и эффективностью сжатия
-b:v 3MЦелевой битрейт видео — 3 Мбит/с
-c:a aacКодек аудио — AAC
-f flvВыходной контейнер — FLV (обязателен для RTMP)
rtmp://...Адрес RTMP-сервера (например, YouTube, Twitch, Wowza)

💡 Важно: в отличие от -c copy, здесь все потоки перекодируются — и видео, и аудио. Это означает, что FFMPEG сначала декодирует входной поток, применяет фильтры (например, масштабирование), а затем кодирует всё заново.


Влияние транскодирования на задержку и нагрузку

Транскодирование — один из самых ресурсоёмких этапов в обработке видео. Он влияет на:

  • Задержку (latency)
  • Нагрузку на CPU
  • Стабильность потока

Почему транскодирование увеличивает задержку?

Процесс кодирования видео требует накопления данных в буферах. Вот где возникает задержка:

  1. Буфер декодера — FFMPEG должен получить и распаковать кадры.
  2. Фильтры — например, масштабирование требует обработки целого кадра.
  3. Буфер кодера — особенно при использовании B-кадров и look-ahead.
  4. GOP (Group of Pictures) — кодер ждёт формирования группы кадров, прежде чем отправить их.

🔄 Пример: если GOP = 60 (при 30 кадрах/с — это 2 секунды), то первый ключевой кадр (I-frame) на выходе появится только через 2 секунды, даже если входной поток начался мгновенно.


Ключевые параметры, влияющие на задержку и нагрузку

Чтобы управлять балансом между качеством, задержкой и нагрузкой, используются следующие параметры:

1. -preset — скорость кодирования

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

ЗначениеСкоростьКачествоНагрузкаЗадержка
ultrafastОчень высокаяНизкоеМинимальнаяОчень низкая
superfastВысокаяНиже среднегоНизкаяНизкая
veryfastСредняяСреднееУмереннаяУмеренная
fasterНиже среднейВыше среднегоВысокаяВыше средней
mediumНизкаяВысокоеВысокаяВысокая

Рекомендация: для реального времени используйте veryfast или superfast. ultrafast — только при острой нехватке CPU.


2. -tune zerolatency — оптимизация под минимальную задержку

Этот параметр отключает некоторые оптимизации кодера, которые требуют look-ahead (анализ будущих кадров), и уменьшает внутренние буферы.

-c:v libx264 -preset veryfast -tune zerolatency

🔧 Что делает:
– Отключает B-кадры (если не указано иное)
– Уменьшает размер VBV-буфера (Video Buffering Verifier)
– Отключает adaptive quantization и другие «тяжёлые» оптимизации


3. -g — длина GOP (Group of Pictures)

Определяет, как часто появляются ключевые кадры (I-frames). Чем короче GOP — тем чаще ключевые кадры, но тем выше битрейт.

-g 30    # при 30 кадрах/с — I-кадр каждую секунду

Рекомендация: для стриминга — GOP от 1 до 2 секунд (например, -g 30 при 30 fps). Это позволяет быстро перезапускать воспроизведение и снижает задержку.


4. Профиль и уровень H.264

FFMPEG позволяет явно указать профиль и уровень кодека, что важно для совместимости с устройствами:

-profile:v baseline -level 3.1
ПрофильИспользование
baselineДля старых устройств, мобильных телефонов, видеонаблюдения
mainУниверсальный, поддерживает B-кадры
highМаксимальное качество, но требует мощного декодера

⚠️ Примечание: профиль baseline не поддерживает B-кадры, что снижает задержку, но ухудшает сжатие.


Сравнение: -c copy vs транскодирование

Чтобы понять разницу, рассмотрим два сценария:

Характеристика-c copy (ремультиплексация)Транскодирование
Нагрузка на CPUОчень низкая (≤5%)Высокая (30–100%)
ЗадержкаМинимальная (50–200 мс)Зависит от настроек (300–2000 мс)
Возможность изменения разрешенияНетДа
Возможность смены кодекаНетДа
КачествоБез потерьЗависит от битрейта и пресета
ИспользованиеПростой рестримингАдаптация под сеть/устройства

📊 Наглядный пример:
Представьте, что вы смотрите прямую трансляцию с камеры.
– При -c copy вы видите кадр почти мгновенно после его съёмки.
– При транскодировании с GOP=60 и буферами кодера — задержка может составить 2–3 секунды, даже если сеть идеальная.


Практические рекомендации

  1. Используйте транскодирование только при необходимости
    Если камера уже передаёт H.264 в нужном разрешении и битрейте — применяйте -c copy.

  2. Настройте параметры под задачу
    Для видеонаблюдения: -preset ultrafast -tune zerolatency -g 25 -profile:v baseline
    Для трансляции в интернет: -preset veryfast -b:v 3M -g 60

  3. Следите за нагрузкой на CPU
    Используйте htop, top или nvidia-smi (если используется GPU-ускорение) для мониторинга.

  4. Рассмотрите аппаратное ускорение
    FFMPEG поддерживает кодирование через GPU (например, h264_nvenc, h264_amf, h264_videotoolbox). Это резко снижает нагрузку на CPU.

    Пример:

    -c:v h264_nvenc -preset p4 -tune ll -g 30

Заключение

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

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