Запись передач (Catchup TV)
Мы реализовали и за несколько лет отладили превосходный механизм записи видео в архив в Flussonic Media Server. В этой статье расскажем, как сделать так, что бы воспользоваться всеми возможностями архива в MiddleWare.
Концепция архива
В большинстве MiddleWare запись передач устроена по принципу старого видеомагнитофона. В нужное время по расписанию включается запись, потом через некоторое время запись прекращается.
Такой подход страдает массой проблем и прежде всего погрешностью в расписании. В начале такой записи идет хвост предыдущей передачи, а финал нужной передачи обрезается. Эту проблему пытаются решать расширением границ записываемой передачи, в итоге на диске образуются нахлестывающиеся записи.
Мы эту задачу в Flussonic Media Server решили по-другому. Flussonic Media Server пишет всё видео в архив в собственном формате и предоставляет доступ к нему, как к бесконечной ленте. Каждый кадр имеет свой адрес — это его реальное время прихода в архив. Когда необходимо посмотреть архив, сообщите с какого времени и по какое надо отдать видео.
Плееры и протоколы к такому решению в целом не привыкли, поэтому Flussonic Media Server умеет подстраиваться под разные варианты использования и предлагать архив в разном виде. Например, можно обратиться к Flussonic Media Server по URL-адресу http://flussonic-ip/ort/index-1429829884-3600.m3u8
и получить часовой HLS плейлист с момента 1429829884
, который будет выглядеть как файл. Таким образом плеер даже не будет догадываться, что это бесконечный архив, а будет просто показывать границы.
Также доступны варианты обращения, когда можно начать играть архив с какого-то момента в режиме потока.
Реализация в MiddleWare
Для того, что бы предоставить человеку доступ к уже записанной передаче, MiddleWare должна сформировать URL к архиву и отдать этот адрес плееру для проигрывания. URL будет иметь вид http://flussonic-ip/ort/index-1429829884-3600.m3u8
.
Время для URL надо брать из EPG, расписания передач, которое есть в каждой MiddleWare. Важно обратить внимание на то, что Flussonic Media Server требует указания времени в UTC, т.е. по Гринвичу.
Плеер получит URL, решит что это файл и покажет стандартные контролы для проигрывания файла. Передачу можно будет спокойно перематывать, ставить на паузу и продолжать играть дальше.
Очень важный момент с постановкой на паузу: дело в том, что поставить на паузу поток — это очень сложная операция, которая доступна не во всех протоколах. Притормозить проигрывание файла гораздо проще.
Просмотр текущей передачи
С передачей, которая ещё не закончилась, всё немного сложнее. Некоторые плееры, как то iOS, Android или StrobeMediaPlayback умеют работать с т.н. Event-плейлистами. Это такой способ предоставления контента, при котором плеер знает, что сервер сейчас показывает какое-то локальное во времени событие. При этом плеер предоставляет возможность как отмотать к началу, так и вернуться к прямому эфиру.
Для этого надо сформировать URL вида: http://flussonic-ip/ort/index-1429829884-now.m3u8
.
Будьте аккуратны, если вы запросите URL за сутки, то Flussonic Media Server отдаст огромного размера плейлист. Мы видели, как сбойный клиент забил себе 100 мегабит канала повторяющимся несколько раз в секунду запросом к одному и тому же event плейлисту. При этом Flussonic Media Server отдавал гигантского размера плейлист в несколько сот килобайт без особой нагрузки за счёт хорошо отлаженной реализации архива.
Однако для многих приставок такой URL не подойдет, потому что приставка будет показывать только прямой эфир без возможности отмотки назад. Для таких приставок надо писать JS код, который отлавливает перемотку и переводит клиента на другой URL:
http://flussonic-ip/ort/timeshift_abs-1429829884.m3u8
, где 1429829884
— это то время, с которого надо играть передачу.
С timeshift_abs HLS URL-адресами есть большая сложность, связанная с природой HLS протокола. Дело в том, что Flussonic Media Server может лишь вероятностно связывать отдельные HTTP запросы в одну сессию. Flussonic Media Server считает, что сессия та же, если у двух запросов совпадает IP адрес клиента, имя канала, протокол запроса и токен. В случае с несколькими, идущими подряд timeshift abs запросами, Flussonic Media Server решит, что это одна и та же сессии. В итоге может получиться искажение просмотра. Чтобы избежать этого, следует передавать в timeshift_abs запрос новый токен.
Вариант попроще — запросить HTTP MPEGTS http://flussonic-ip/ort/timeshift_abs-1429829884.ts
.
Однако HTTP MPEGTS вариант лишает доступа к мультибитрейту.
Мультиязык
Традиционно MPEG-TS протокол предлагает стандартизованный механиз выбора языковой дорожки и субтитров при одном видеобитрейте.
Протокол HLS, основанный на MPEG-TS отказывается от упаковки нескольких аудиодорожек в один поток и предлагает раздавать альтернативные аудиодорожки в отдельных сегментах, которые потом надо микшировать на плеере. Так работает плеер в iOS, но так не работает большинство плееров в STB.
Для того, что бы пользователь увидел несколько разных языков при передаче видео по HLS на такие STB, как Mag, Dune, Eltex, надо использовать другой URL: http://flussonic-ip/ort/video.m3u8
, http://flussonic-ip/ort/video-1429829884-3600.m3u8
, http://flussonic-ip/ort/timeshift_abs_video-1429829884.m3u8
.
При запросе этих URL Flussonic Media Server по-другому упаковывает дорожки и позволяет плеерам, не поддерживающим полностью стандарт HLS, добраться до разных вариантов аудио.
Статус записи
Более продвинутая MiddleWare может уточнять у Flussonic Media Server, записана передача или нет. Для этого надо обратиться по HTTP API:
http://flussonic-ip/ort/recording_status.json?from=1429960179&to=1429963716
Поля from
и to
означают границы передачи.
В ответ придет JSON:
[{
"stream":"ort",
"ranges":[{"from":1429960179,"duration":3542}],
"motion_log":[]
}]
Поле ranges
содержит массив из объектов, означающих зоны непрерывной записи. Если есть дырки в записи, в массиве будет более одного объекта. При отсутствии записи за указанное время массив будет пустой.