Skip to content

Стрим с источником MPEG-DASH

Стрим Catena умеет забирать источник, который отдаётся манифестом MPEG-DASH: стример следует за манифестом как обычный плеер, скачивает появляющиеся сегменты и отдаёт их кадры дальше — в транскодер, архив и на раздачу. Так забирают сигнал у партнёра, у чужого CDN и у оборудования, которое кроме DASH ничего не отдаёт.

Эта страница — про то, чем DASH отличается от остальных источников. Общий порядок работы с источниками — на странице Стрим с внешним источником, несколько источников с приоритетом — на странице Резервирование источников.

Добавьте источник

Откройте страницу стрима, вкладку Источники, нажмите + Добавить источник и выберите протокол MPEG-DASH. Впишите в поле URL адрес манифеста и нажмите Сохранить:

Источник MPEG-DASH: адрес манифеста и поля входа

Адрес — это обычная ссылка на манифест, http://…/manifest.mpd или https://…/manifest.mpd; стример опознаёт манифест сам. Если источник отдаёт манифест по адресу без расширения .mpd, запишите его схемой dash:// (или dashs:// для HTTPS) — это тот же захват, просто сказанный явно.

Через несколько секунд карточка здоровья источника показывает состояние Работает и разобранные дорожки — стример следует за манифестом:

DASH-источник подключён, стрим в эфире

Что стример делает с манифестом

  • Захват начинается с живого края. Всё, что лежало в окне сдвига источника на момент подключения, — это история, и она не скачивается. По той же причине после обрыва стример не догоняет пропущенное: минута простоя так и остаётся минутой, а не приезжает пачкой в реальный эфир.
  • Период обновления манифеста называет источник. Стример перечитывает манифест так часто, как объявлено в нём самом (minimumUpdatePeriod); отдельной настройки для этого нет и быть не должно — своё значение поверх чужого даёт либо лишний трафик, либо пропущенные сегменты.
  • Новый период в манифесте — разрыв таймлайна. Врезка, blackout или смена профиля кодирования снаружи неразличимы: стример объявляет разрыв и заново перечитывает описание дорожек.
  • Источник может переехать. Если манифест приносит элемент Location, дальнейшие обновления уходят по новому адресу — так раздают сессии; адрес в настройках стрима при этом не меняется.
  • Время источника уже календарное. DASH привязывает сегменты к UTC самим протоколом, поэтому архив и перемотка ложатся на календарную шкалу без догадок о настенных часах.
  • Конец вещания завершает захват. Когда источник закрывает вещание, стример доотдаёт оставшиеся сегменты и перестаёт опрашивать манифест.

Поля источника

Пустое поле означает умолчание сервера — заполняйте только то, что действительно нужно менять.

Поле Что делает
URL Адрес манифеста источника
Битрейт представления (бит/с) Какое представление брать: ближайшее снизу к указанному числу. Пусто — старшее в наборе
Принимать лесенку целиком Брать все представления набора вместо одного — см. ниже
Порог расхождения (мс) Насколько представлениям позволено разъехаться, прежде чем лестница считается разошедшейся
Если представления разошлись Что делать по этому вердикту
Таймаут соединения (мс) Сколько ждать установления соединения с источником; умолчание — 5000
Таймаут тела (мс) Сколько ждать тела ответа; умолчание — 15000
Потолок размера тела (байт) Ограничение на размер одного ответа: ошибочно огромный ответ не вычерпает память стримера
Таймаут пира (мс) Сколько ждать кадров, прежде чем считать источник потерянным
Заголовки запросов Дополнительные HTTP-заголовки — в первую очередь Authorization. Уходят и с манифестом, и с сегментами; значения в логи не попадают
Ключи ClearKey Ключи для защищённого источника — см. ниже

Два последних поля — списки пар: заголовок появляется в документе, как только у него есть имя.

Одно представление или вся лестница

По умолчанию стрим берёт одно представление — старшее по объявленному битрейту, а при заданном поле Битрейт представления — ближайшее снизу к нему. Это осознанное умолчание: захват лестницы целиком кратно умножает и входящий трафик, и число дорожек стрима, и во столько же раз укорачивает архив на тех же дисках.

Флажок Принимать лесенку целиком включает приём всех представлений набора. Он нужен, когда источник уже отдаёт готовую лестницу качеств и транскодировать её заново незачем — стрим раздаёт зрителям то же, что забрал.

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

  • Оставить лесенку, показать расхождение — умолчание: приём продолжается, а расхождение видно в статистике стрима и в логе.
  • Откатиться на одно представление — захват перезапускается с одним представлением. Откат случается один раз за жизнь источника, иначе перезапуск снова поднимал бы лестницу и снова на ней спотыкался.

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

Защищённый источник и ключи ClearKey

Если манифест объявляет защиту контента, а ключи не заданы, источник отвергается с ошибкой, называющей схему защиты. Это сделано намеренно: зашифрованные сегменты разбираются как структура и дают кадры с мусором вместо картинки, и без явного отказа поломку ищут в кодеке.

Чтобы забрать такой источник, заполните блок Ключи ClearKey парами Идентификатор ключаКлюч. Обе половины пишутся шестнадцатеричной строкой, идентификатор допускается и в виде UUID с дефисами. Стример расшифрует сегменты по схеме cenc и дальше работает с ними как с обычными.

Чего здесь нет и не будет — обращения к лицензионным серверам Widevine, PlayReady и FairPlay: им нужна доверенная среда исполнения на устройстве зрителя, которой у стримера нет. Их объявления в манифесте рядом со схемой cenc захвату не мешают и просто игнорируются.

Ключ считается секретом: в логи он не попадает, а в API отдаётся замещённым. Идентификатор ключа секретом не является — он лежит в манифесте открытым текстом и нужен для диагностики.

Шифрование того, что стрим отдаёт зрителям, — это другая задача и другая настройка: Шифрование раздачи.

Чего захват не делает

  • Адресация только шаблоном сегментов. SegmentList и SegmentBase не поддерживаются; такой источник отвергается с ошибкой, называющей, что именно встретилось в манифесте.
  • Контейнер только fMP4. Ничего другого в сегментах DASH стример не ожидает и угадывать не пытается.
  • Субтитры не захватываются. Наборы с типом text пропускаются, о чём остаётся запись в логе.
  • Запись источником не станет. Статический манифест — это VOD, а не вещание; он отвергается с явной причиной. Файлы живут в каталоге VOD.

Если источник не поднялся

  • Причина отказа называет схему защиты. Источник зашифрован — заполните ключи ClearKey.
  • Причина отказа называет SegmentList или SegmentBase. Источник адресован не шаблоном сегментов; такой манифест захват не поддерживает.
  • Причина отказа называет статический манифест. Дана ссылка на запись, а не на вещание.
  • Ответы 401 или 403. Источник требует авторизации — добавьте заголовок Authorization в Заголовки запросов.
  • Манифест обновляется, а кадров нет. Так выглядит манифест, оставшийся лежать после умершего вещания: время идёт, адреса вычисляются, а запросы за сегментами отвечают 404. Стрим добьёт такой источник по таймауту отсутствия кадров. Разделить эти два случая помогает диагностика источника: время последнего обновления манифеста и время последней выдачи кадров считаются раздельно.
  • Сегменты отвечают 404 сразу после старта. В DASH момент появления сегмента вычисляется по часам, поэтому расхождение часов стримера с часами источника ломает захват. Проверьте синхронизацию времени на машине стримера.
  • Стрим не стартует, причина называет лимит захвата DASH. В лицензии нет позиций на этот вход — он считается отдельно от HLS. За расширением лицензии обращайтесь к вашему менеджеру.