Skip to content

Работа с архивом DVR в Middleware

Эта статья должна помочь разработчику Middleware реализовать работу с архивом видео для реализации следующих задач пользователя:

  • поставить прямой эфир на паузу, сходить покурить
  • посмотреть текущую передачу с начала, потому что фильм понравился и надо сначала
  • посмотреть вчерашнюю передачу
  • отложить понравившуюся передачу в закладки, пересмотреть через пару месяцев

Проблема по которой существует эта статья заключается в том, что единственный протокол, который технически может решать эти проблемы - это RTSP, но от него давно отказались и перешли на сегментные HTTP: HLS, DASH (и немного MSS). Оба основных протокола для IPTV OTT не поддерживают эту функциональность из коробки и поэтому необходимы технологические исхищрения для решения этих задач.

В медиа сервере мы предлагаем несколько подходов к решению указанных задач. Названия наши собственные, не являются индустриальным стандартом.

short name pros cons
epg-vod работает пауза, ускоренная перемотка нужен код на плеере; нужна поддержка перемотки в event
pseudo-live без доработки клиента играет архив с любой точки нельзя ставить на паузу, ускорять

Как же правильнее всего организовать доступ к архиву?

С помощью epg-vod проигрывания архива и event проигрывания лайва.

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

Для работы этого метода, Middleware должна хранить у себя достаточно точное расписание EPG. Здесь и далее будут отсылки к понятию таймстемпа, времени. Мы рассматриваем только секунды в UTC (он же Epoch). Ни при каких обстоятельствах локальное время не рассматривается, потому что ничего кроме хаоса его использование тут не вносит.

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

Когда пользователь выбирает передачу из архива, которая шла с 1717677139 UTC до 1717679255, надо сформировать для плеера урл: http://FLUSSONIC-IP/STREAM_NAME/archive-1717677139-2116.m3u8?event=true

В плеере будет работать:

  • перемотка внутри передачи
  • пауза
  • ускоренный просмотр

При завершении проигрывания рекомендуется переключить на следующую передачу в EPG, чтобы сохранять непрерывность поступления контента в потребителя.

Просмотр текущей передачи с помощью event-плейлистов

Просмотр текущей передачи технологически будет сложнее. Мы предлагаем использовать event плейлисты, но они в нативном Сафари не позволяют отмотку назад, поэтому для ТВ не годятся и тогда вам нужно писать на яваскрипте и реализовывать собственный таймлайн. Если Сафари для вас не критичен, то смело используйте точно те же урлы, что и в epg-vod:

http://FLUSSONIC-IP/STREAM_NAME/archive-1717677139-2116.m3u8?event=true

Хитрость в том, что если момент закрытия плейлиста в будущем, то он будет отдаваться не как VOD, а как EVENT, что позволит плееру его перезапрашивать и двигаться дальше.

После закрытия этого плейлиста надо так же переключиться на следующий по EPG и продолжить просмотр.

Использование такого урла позволит поставить лайв на паузу и продолжить с того же места. Особенно важно отметить, что кнопку «live» необходимо программировать самостоятельно, потому что за время удержания на паузе плейлист может автоматически превратиться из EVENT в VOD и закрыться. В этом случае надо по EPG выяснить, какая передача следующая и перепрыгнуть на неё.

Pseudo-live DVR access

Самый ленивый и простой способ проиграть архив - это отправить плеер на псевдо-лайв из архива http://FLUSSONIC-IP:PORT/STREAM_NAME/timeshift_abs-1429829884.m3u8. Для такого запроса создается новая сессия, время создания которой запоминается на сервере. При последующем обращени начало этого плейлиста сдвигается и постоянно отдаются несколько сегментов, симулируя лайв.

Плеер его проигрывает и показывает прямой эфир, который на самом деле является стримом из архива.

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

Мы не рекомендуем использование такого подхода кроме случаев, когда очень надо, очень быстро и не очень жалко клиента.