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 в логах стримера.