Skip to content

Проигрывание архива

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

Проигрывание работает у стрима с включённой записью. У стрима без записи запрос архива отклоняется. Глубину проигрывания задаёт глубина хранения: запрос глубже начала архива отдаётся от начала архива, а не пустой выдачей.

Отмотка назад

Плейлист, отмотанный на N секунд назад от текущего момента:

http://<адрес-станции>/streaming/v/<стрим>/rewind/<секунд>/index.m3u8

Например, rewind/3600/ — час назад.

Плейлист начинается в архиве и продолжается эфиром: на стыке нет ни дублей, ни пропусков, и проигрыватель перехода не замечает. Приём блокирующей перезагрузки LL-HLS продолжает работать. Разрывы записи отмечаются стандартным EXT-X-DISCONTINUITY.

То же для MPEG-TS HLS — под сегментом ts/:

http://<адрес-станции>/streaming/v/<стрим>/ts/rewind/<секунд>/index.m3u8

Окно по абсолютному времени

Отрезок архива задаётся параметрами from и to — UTC в миллисекундах:

http://<адрес-станции>/streaming/v/<стрим>/index.m3u8?from=<мс>&to=<мс>
http://<адрес-станции>/streaming/v/<стрим>/Manifest.mpd?from=<мс>&to=<мс>
  • Без from адрес отдаёт эфир; с from начинается архив, и плейлист HLS становится закрытым — он описывает ровно записанное окно и не растёт;
  • без to правый край окна открыт вперёд.

У DASH разрывы записи оформляются периодами, а шкала времени выбирается параметром timeline:

  • compact — по умолчанию: периоды следуют один за другим без разрывов, время в манифесте непрерывно;
  • wallclock — разрывы сохраняются, и положение отрезка в манифесте совпадает с настенным временем.

Например, окно с настенной шкалой:

http://<адрес-станции>/streaming/v/<стрим>/Manifest.mpd?from=<мс>&to=<мс>&timeline=wallclock

Записанные окна

Какие отрезки записаны, отдаёт отдельный запрос. Край архива и нижняя граница:

http://<адрес-станции>/streaming/dvr-range/<стрим>
{"from": 1789546139000, "to": 1789553339000}

Оба значения — UTC в миллисекундах.

Окна записи страницами:

http://<адрес-станции>/streaming/dvr-ranges/<стрим>?resolution=<мс>&limit=<штук>&cursor=<курсор>
{
  "estimated_count": 2,
  "next": "MTc4OTU0NjEzOTAwMA",
  "ranges": [
    {"opened_at": 1789546139000, "closed_at": 1789549739000},
    {"opened_at": 1789550400000, "closed_at": 1789553339000}
  ]
}
  • opened_at и closed_at — начало и конец одного непрерывного окна записи, UTC в миллисекундах;
  • resolution — с какой точностью склеивать соседние окна, миллисекунды. Ноль означает точность записи;
  • limit — размер страницы, по умолчанию 100, потолок 10000;
  • cursor — значение next предыдущей страницы. Курсор непрозрачен: его внутреннее устройство частью контракта не является;
  • next отсутствует у последней страницы.

Окна можно отфильтровать по времени: opened_at_gte, opened_at_lte, closed_at_gte — UTC в миллисекунды. Значение, похожее на секунды эпохи, отвергается с 422: молча домноженное на 1000, оно вернуло бы пустую выдачу за 1970 год вместо ошибки.

Превью кадров

  • JPEG-кадр из дорожки изображений на заданный момент:

text http://<адрес-станции>/streaming/v/<стрим>/image/<дорожка>/<мс>.jpg

  • Короткий MP4-фрагмент от ключевого кадра:

text http://<адрес-станции>/streaming/dvr-preview-mp4/<стрим>/<мс>

Оба адреса читают архив: кадр собирается из ближайшего фрагмента, а не выдаётся из готового кэша.

Страница плеера

Проверить архив в браузере, не собирая адреса вручную, можно страницей плеера:

http://<адрес-станции>/streaming/embed/<стрим>?dvr=true&from=<мс>&to=<мс>
  • dvr=true открывает ленту архива. Без параметра страница показывает эфир: у стрима без записи она сама возвращается к живому плееру;
  • from и to задают окно ленты, UTC в миллисекунды.

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

Что дальше