Проигрывание архива¶
Записанный архив отдаётся теми же протоколами, что и эфир: 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 в миллисекунды.
Эти адреса проверяют сигнал, а не раздают его зрителям: балансировка, авторизация зрителей и учёт сессий начинаются там, где заканчивается головная станция. Требования к плееру те же, что у эфира.
Что дальше¶
- Выгрузка архива — отрезок одним файлом MP4.
- Запись и чтение — куда пишется архив и как проверяется запись.
- Субтитры и телетекст — что попадает в архив вместе с видео.