Skip to content

MBR

media.transcode.mbr

Транскодер Sapsan меняет кодеки, битрейт и разрешение и готовит мультибитрейтную лесенку (MBR). Несколько выходных качеств могут использовать одну исходную видеодорожку: она декодируется один раз, а полученные кадры поступают в кодеры выходных качеств.

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

Как Sapsan строит согласованную лесенку

Мультибитрейтное транскодирование создаёт несколько представлений одного видео. Они отличаются размером кадра и битрейтом, могут использовать разные кодеки, но должны показывать одну и ту же картинку в один и тот же момент. Sapsan обрабатывает их как единый видеоконвейер с общей временной шкалой.

Декодирование один раз для всех качеств

У каждой исходной видеодорожки один декодер для всех её выходных качеств. Входной сжатый кадр декодируется один раз; полученная картинка передаётся на масштабирование и кодирование каждого качества. Например, для трёх выходных качеств Sapsan выполняет одно декодирование входа и три выходных кодирования.

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

Одинаковые таймстемпы соответствующих кадров

Одна исходная картинка получает общую метку времени показа PTS во всех своих выходных качествах. Совпадают сами метки, а не только номинальная частота кадров. Плеер может сопоставить соответствующие картинки разных качеств по одному медиавремени.

Например, при частоте 25 кадров/с время показа в секундах выглядит так:

Картинка 1080p H.264 720p HEVC 360p AV1
Первая 2.000 2.000 2.000
Следующая 2.040 2.040 2.040
Ещё одна 2.080 2.080 2.080

Для качеств одной исходной дорожки сервер использует точность временной шкалы источника: исходные PTS не округляются до целого номера кадра только ради кодирования. Разные скорости работы кодеров также не создают для качеств независимые часы.

DTS задаёт порядок декодирования и зависит от перестановки кадров конкретным кодером. При использовании B-кадров DTS может отличаться от PTS и между кодеками. Для сопоставления одной и той же картинки между качествами используется общий PTS.

Синхронизированные ключевые кадры

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

Для согласованной лесенки задавайте одинаковые gop_size и gop_structure у её видеовыходов. Например, при 25 кадрах/с и gop_size: 50 плановый интервал ключевых кадров составляет две секунды для всех качеств. В примере ниже оба качества используют одну исходную дорожку и одинаковую структуру GOP.

Сведение дорожек в общий выходной поток

Кодерам может требоваться разное время для подготовки кадра, особенно при разных кодеках или использовании B-кадров. Sapsan сводит результаты видеокодеров и звуковые дорожки по общей медиашкале: выходной интерливер буферизует кадры и упорядочивает их по DTS. Поэтому скорость завершения отдельного кодирования не определяет порядок кадров всего стрима.

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

Настройка

Настройка выполняется через API central. В примерах используется объектная форма YAML; например, source: {content: audio} передаётся в JSON как "source": {"content": "audio"}. Поддерживается и YAML-запись с тегом: source: !content audio.

Пусть один стрим получает следующие варианты сигнала:

Вход Видео Звук
Основной, MPEG-TS по UDP v1, HEVC, 1920×1080 a1: английский MPEG Audio, eng; a2: русский AC-3, rus
Резервный, HLS v3, H.264, 1280×720 a4: русский AAC, rus

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

streams:
  - name: tv1
    inputs:
      - udp: {host: 239.0.0.1, port: 5000}
      - hls: {url: https://backup.example.com/tv1/index.m3u8}
    transcoder:
      output:
        - source: {best_quality: video}
          codec: {set: h264}
          bitrate: 2800000
          params:
            video:
              gop_size: 50
              gop_structure: ibbbp
              resize: {fit: {width: 1920, height: 1080}}
        - source: {best_quality: video}
          codec: {set: h264}
          bitrate: 1200000
          params:
            video:
              gop_size: 50
              gop_structure: ibbbp
              resize: {fit: {width: 1280, height: 720}}
        - source: {language: rus}
          codec: {set: aac}
          bitrate: 128000

Из видео любого из этих входов формируются два качества H.264, а выбранная русская звуковая дорожка подготавливается для выдачи в AAC. Английская дорожка основного входа не подходит под звуковое правило. Само переключение входов выполняет LSI; правила source выбирают дорожки уже активного входа.

Выбор исходной дорожки

source Как выбираются дорожки в live-стриме
{exact: v1} или {exact: a2} Одна дорожка с указанным входным ID. Это логический ID Sapsan, а не PID MPEG-TS.
{content: video} или {content: audio} Все дорожки указанного типа. Одно правило может создать несколько выходов.
{best_quality: video} или {best_quality: audio} Одна дорожка указанного типа с максимальным объявленным bandwidth.
{language: rus} Все аудиодорожки, у которых язык точно равен rus, независимо от кодека и ID.
{language_codec: [rus, aac]} Все аудиодорожки с языком rus и кодеком aac одновременно.
{codecs: [pcma, pcmu]} Все дорожки, кодек которых входит в заданный непустой набор.

Язык берётся из метаданных источника. Значение сравнивается точно: rus и ru — разные строки. При отсутствии языковой метки правило по языку не совпадёт. Если на входе несколько русских дорожек, language: rus выберет каждую; для более узкого выбора используйте язык вместе с кодеком или конкретный ID.

best_quality сравнивает объявленный битрейт, а не разрешение или визуальное качество. Отсутствующий bandwidth считается нулевым; при равенстве выбирается последняя подходящая дорожка в текущем описании входа. Выбор выполняется при настройке транскодера. Обновление одной лишь оценки битрейта не запускает автоматическое переключение между дорожками.

Каждое правило выполняется независимо. Несколько правил с одним источником создают несколько выходных качеств. Правила language: rus и content: audio одновременно обработают русскую дорожку; такая запись не означает «русский, а при его отсутствии — любой звук».

Что меняется при переключении входов

Когда состав или значимые параметры входа изменяются, Sapsan повторно сопоставляет правила с новым описанием дорожек и перенастраивает обработку. Учитываются изменения ID и порядка дорожек, кодеков и параметров декодирования. Для звука учитывается также язык.

В примере выше правило language: rus выберет a2 основного входа и a4 резервного. Правило exact: a2 на резервном входе ничего не выберет. А правило language_codec: [rus, ac3] намеренно ограничит обработку русским AC-3 и не совпадёт с резервным AAC.

Номера выходных дорожек могут меняться при изменении входа. В частности, уже подходящая дорожка AAC-LC может пройти без повторного кодирования и сохранить свой входной ID; это оптимизация после выбора источника. Перенастройка декодеров и кодеров также может дать переход на выходе. Правила выбора позволяют работать с разными структурами источников, но сами по себе не гарантируют бесшовного переключения.

Перекодировать все звуковые дорожки

Для многоязычного телеканала можно сохранить весь доступный набор языков и привести звук к AAC:

transcoder:
  output:
    - source: {best_quality: video}
      codec: {set: h264}
      bitrate: 2000000
    - source: {content: audio}
      codec: {set: aac}
      bitrate: 128000

Если основной вход содержит две звуковые дорожки, правило звука обработает обе. Если у резерва осталась одна, на выходе будет одна. Такой выбор обрабатывает доступный набор исходных звуковых дорожек; постоянное количество выходов он не задаёт.

Выбор по языку использует метаданные входа. В текущем live-тракте языковая метка не переносится на заново кодируемое аудио; при сквозной передаче она сохраняется. Учитывайте это при проверке названий языков в плеере.

Перекодировать только заданные кодеки

Для источников, у которых звук может приходить в PCMA, PCMU или AAC, можно отдельно задать преобразование G.711 и сквозную передачу AAC:

transcoder:
  output:
    - source: {best_quality: video}
      codec: {set: h264}
      bitrate: 2000000
    - source: {codecs: [pcma, pcmu]}
      codec: {set: aac}
      bitrate: 128000
    - source: {codecs: [aac]}
      codec: same

Правило с набором кодеков выбирает и PCMA, и PCMU без привязки к номеру звуковой дорожки. Другое правило сохраняет уже имеющийся AAC без перекодирования. Если G.711 и AAC присутствуют одновременно, выполнятся оба правила. Кодек за пределами этих наборов, например AC-3, звуковыми правилами этого примера не выбран.

Если подходящей дорожки нет

В live-транскодере правило без совпадений не создаёт выходную дорожку. Например, отсутствие rus не приводит к выбору английского звука или генерации тишины. Остальные совпавшие правила продолжают формировать свои выходы.

Поле if_missing есть в модели конфигурации, но live-тракт не исполняет его режимы fail, blank и substitute. На них нельзя опираться для подстановки отсутствующей дорожки при переключении источников.

Примеры выше включают реальное кодирование. Если все правила используют только codec: same, включается общий сквозной режим; такую конфигурацию нельзя использовать для фильтрации дорожек через source.

Кодеки и параметры

  • codec: {set: h264} — перекодировать в заданный кодек. Подробности параметров приведены в кодировании видео. Запись codec: same сохраняет исходные кадры без перекодирования.
  • Согласованная лесенка: выходы разных кодеков из одной видеодорожки держат выровненные таймстемпы и ключевые кадры.
  • gop_size и gop_structure: управление длиной и структурой GOP для согласованных сегментов MBR.
  • Аудио G.711: перекодирование в AAC или Opus с сохранением временной шкалы описано также в кодировании аудио.
  • Служебные дорожки: поддерживаемые дорожки субтитров и JPEG-превью могут сохраняться сквозным проходом. Проверяйте итоговый состав стрима, а не только правила кодирования.

Изменение размера

resize Что делает
{scale: {width: 1280, height: 720}} Масштабирует точно в заданный размер.
{fit: {width: 1280, height: 720}} Вписывает изображение с сохранением пропорций, добавляя поля при необходимости.
{crop: {width: 1280, height: 720}} Обрезает изображение под заданный размер.

Проверка

Проверьте входные метаданные и итоговый состав дорожек в статистике стрима. Затем откройте мастер-плейлист http://server/streaming/v/tv1/index.m3u8 и проверьте выходные качества и языки звука.

Переключите стрим на резерв и проверьте его отдельно: какое видео выбрано, сколько звуковых дорожек получилось, сохранились ли нужные языки. Для диагностики перенастройки полезны сообщения encode backend selected input tracks и таблица соответствия входных и выходных дорожек encode backend stream mapping в логах стримера.