Skip to content

Воспроизведение HLS

Flussonic Media Server поддерживает раздачу видео по протоколу HLS. Многие из доступных возможностей нестандартны для HLS, но мы поддерживаем их для вашего удобства.

Поддерживаемые кодеки: H264, H265, MPEG2 video, AAC, MP3, MPEG2 audio, AC-3.

Flussonic Media Server позволяет получать по HLS прямой эфир, видео по запросу, видео из архива (catchup и timeshift).

Если входной поток содержал DVB субтитры или телетекст, то они будут переданы в выходной поток, проигрываемый по HLS, если настроить Flussonic для этого. Если поток пишется в архив, то и субтитры сохраняются в архиве.

Содержание:

Структура протокола HLS

Принцип работы протокола HLS заключается в разбиении всего потока или файла на медиа-сегменты одинаковой длины. Сегменты представляют собой файлы с расширением .ts, которые последовательно скачиваются по HTTP. Кроме того, HLS создает файл индекса, который содержит ссылки на файлы медиа-сегментов и сохраняется с расширением .m3u8.

Вы можете использовать для проигрывания HLS разные URL, в зависимости от нужного сценария, но в любом случае, по каждому из этих URL вы получите плейлист (или манифест) одного из двух следующих типов.

Медиа-плейлист

Медиа-плейлист — это плейлист, в котором все строки обозначают отдельные медиа-сегменты. Каждый медиа-сегмент указан с помощью URI файла с расширением .ts. Плейлист дополняется новыми URI во время проигрывания. Такой плейлист используется для проигрывания простых потоков или файлов с одной видеодорожкой и одной аудиодорожкой.

Пример медиа-плейлиста:

#EXTM3U
#EXT-X-TARGETDURATION:7
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:38530
#EXT-X-PROGRAM-DATE-TIME:2022-03-22T08:06:37Z
#EXTINF:5.000,
2022/03/22/08/06/37-05000.ts
#EXTINF:5.000,
2022/03/22/08/06/42-05000.ts
#EXTINF:5.000,
2022/03/22/08/06/47-05000.ts
#EXTINF:5.000,
2022/03/22/08/06/52-05000.ts

Мастер-плейлист

Мастер-плейлист — это плейлист, в котором все строки обозначают отдельные медиа-плейлисты. Каждый медиа-плейлист указан с помощью URI файла с расширением .m3u8. Мастер-плейлист можно использовать для проигрывания мультибитрейтных потоков или файлов. Он позволяет клиенту динамически переключаться между потоками или файлами с разным качеством.

Пример мастер-плейлиста:

#EXTM3U
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,RESOLUTION=640x480,FRAME-RATE=25.000,CODECS="avc1.4d001f,mp4a.40.2",AVERAGE-BANDWIDTH=500000,BANDWIDTH=630000
tracks-v3a1/mono.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,RESOLUTION=768x576,FRAME-RATE=25.000,CODECS="avc1.4d001f,mp4a.40.2",AVERAGE-BANDWIDTH=610000,BANDWIDTH=770000
tracks-v2a1/mono.m3u8
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,RESOLUTION=960x720,FRAME-RATE=25.000,CODECS="avc1.4d001f,mp4a.40.2",AVERAGE-BANDWIDTH=650000,BANDWIDTH=820000
tracks-v1a1/mono.m3u8

Стандартное воспроизведение HLS

Если у вас есть простой live поток или файл (одно видео, один звук), то URL для воспроизведения через HLS очень простой:

http://FLUSSONIC-IP/STREAM_NAME/index.m3u8

где FLUSSONIC-IP — это пример адреса + порта вашего Flussonic Media Server.

Flussonic Media Server также принимает playlist.m3u8 в конце URL для обратной совместимости с другими серверами.

Когда вы начинаете работать с мультиязычными или мультибитрейтными контентом, все становится сложнее.

Воспроизведение по HLS fMP4 для H.265

Фрагментированный MP4 (fMP4) дает важные преимущества. Прежде всего, это единственный способ воспроизвести видео в HEVC через HLS. Кроме того, контейнер MP4 поддерживается любым плеером, в отличие от с MPEG. Формат fMP4 также может использоваться DASH, так что только манифест будет отличаться от HLS, а кодирование MP4 будет выполняться один раз для обоих протоколов.

По следующему URL можно воспроизвести HLS c кодированием в MP4-фрагменты:


http://FLUSSONIC-IP/STREAMNAME/index.fmp4.m3u8

где FLUSSONIC-IP — это пример адреса + порта вашего Flussonic Media Server.

Воспроизведение по Low-Latency HLS

Flussonic поддерживает воспроизведение по Apple Low-Latency HLS (LL-HLS) — это потоковый протокол, который основан на HLS и преодолевает его высокую задержку.

LL-HLS поддерживает те же кодеки, что и HLS (H.264, AAC, MP3), а также HEVC (H.265). Контейнер может быть MPEG-TS или fMP4 (фрагментированный MP4). Flussonic использует fMP4 для упаковки потоков для доставки LL-HLS. Упаковка в fMP4 производится по стандарту CMAF.

Подготовка

Перед использованием HLS с низкой задержкой помните, что нагрузка на сеть и сервер будет увеличиваться, поскольку этот протокол делит сегменты HLS на ещё более мелкие сегменты (также называемые чанками (chunks)).

Кроме того, чтобы получить действительно низкую задержку, вы должны подготовить поток, закодировав его с небольшм GOP (группы изображений). Мы рекомендуем GOP размером 1 или 2 секунды. Транскодер Flussonic создает GOP постоянного размера, который вы можете указать на странице настроек транскодера. Если у видео FPS=25, то секундный GOP будет иметь размер 25 кадров, его и нужно указать в настройках транскодера.

GOP for LL-HLS

Настройка LL-HLS

Чтобы проигрывать поток по протоколу Apple Low-Latency HLS:

  1. Включите CMAF в настройках потока на вкладке Output. Если не видите переключатель CMAF, промотайте страницу вниз.

    CMAF

    CMAF — стандарт, который используется для создания MP4-фрагментов, совместимых со спецификацией на Low-Latency HLS.*

  2. Откройте в плеере URL следующего вида:

http://FLUSSONIC-IP/example_stream/index.ll.m3u8

Полная поддержка LL-HLS есть в плеере THEOplayer.

Настройки LL-HLS в файле конфигурации

В качестве альтернативы вы можете включить CMAF в файле etc/flussonic/flussonic.conf:

stream example_stream {
  input fake://fake;
  cmaf on;
}

Файл конфигурации также позволяет задать дополнительные параметры (если необходимо):

Параметры Тип данных Описание Пример
segment_duration целое число (в секундах) Длительность сегмента в HLS-потоке. segment_duration 4;
segment_count целое число Количество сегментов в HLS-плейлисте. segment_count 4;
chunk_duration целое число (в миллисекундах) Длительность CMAF-чанка, или частичного сегмента HLS, сегмента HLS. По умолчанию значение равно 200 . chunk_duration 300;

Примените новую конфигурацию, перезагрузив Flussonic:

service flussonic reload

Note

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

Мультиязычный HLS

Если вы хотите воспроизвести ваш мультиязычный поток на iPhone, вам нужно использовать тот же http://192.168.2.3:80/STREAMNAME/index.m3u8

Но если вы хотите посмотреть мультиязычный поток используя VLC или приставку, нужно включать video.m3u8.

URL для плеера:

http://FLUSSONIC-IP/STREAM_NAME/video.m3u8

Это связано с тем, что, согласно требованиям Apple HLS, для каждого отдельного языка нужно указывать отдельный плейлист с audio only вариантом. В MPEG-TS другой механизм: рядом с видео укладываются все аудиодорожки, и плеер сам выбирает, что будет проигрывать. Чтобы видео можно было посмотреть на iPhone, оно должно соответствовать требованиям Apple. Но VLC и приставки, в нарушение стандарта HLS, ожидают старый вариант MPEG-TS, преобразованный в HLS. Поэтому нужно включать video.m3u8.

Добавление «Audio only» для Apple

Apple требует, чтобы у всех ваших потоков был вариант без видео, только звук.

Они считают, что если пользователь смотрит видео по 3G и, оказавшись в зоне неуверенного приема, лучше у него будет только звук, чем буферизация.

Вы можете включить эту опцию в Flussonic Media Server следующим образом:

stream example {
  input file://vod/bunny.mp4;
  add_audio_only;
}

Note

Такая настройка может сделать ваш index.m3u8 адрес невоспроизводимым в VLC или на приставке. В этом случае используйте video.m3u8 (см. выше).

Отдельные плейлисты для STB-приставок

Когда у вас есть мультибитрейтный мультиязычный контент и Вы хотите проиграть его на приставке, которая не поддерживает мультибитрейтные HLS-плейлисты, вы можете запросить с Flussonic Media Server отдельные плейлисты с одним видео и всеми звуковыми дорожками, как с опцией mono:

http://FLUSSONIC-IP/STREAM_NAME/mono.m3u8

Этот плейлист не мультибитрейтный (не вариантный), в нем URL до сегментов, в которых первая видео дорожка и все доступные звуковые дорожки.

Если вы хотите доставлять мультиязычные мультибитрейтные потоки на приставки, не понимающие стандарт Apple для мультиязычности, используйте video.m3u8:

http://FLUSSONIC-IP/STREAM_NAME/video.m3u8

Это мультибитрейтный плейлист, который отдает список плейлистов с разными качествами: video1.m3u8, video2.m3u8 и т.д.

Отдельные плейлисты для аудио

HLS-поток может содержать несколько аудиодорожек. Некоторые Smart TV (например, Samsung TV) и браузеры, поддерживающие стандарт MSE (Media Source Extensions), не умеют переключаться между таковыми. Несколько аудиодорожек используется, например, для адаптирования контента для нескольких стран и народов. В результате плееры проигрывают только одну дорожку аудио, или же поток может вовсе не воспроизводиться.

Flussonic может отдать на выход плейлист с отдельным аудио. Используйте separate_audio=true в строке запроса HLS-плейлиста для плеера, чтобы получить отдельный плейлист с аудио:

http://FLUSSONIC-IP/STREAM_NAME/index.m3u8?separate_audio=true

Вот как будет выглядеть плейлист:

#EXTM3U
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="eng a1",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",URI="tracks-a1/mono.m3u8"
#EXT-X-STREAM-INF:AUDIO="aac",CLOSED-CAPTIONS=NONE,RESOLUTION=320x240,FRAME-RATE=25.000,CODECS="avc1.420015,mp4a.40.2",AVERAGE-BANDWIDTH=240000,BANDWIDTH=310000
tracks-v1/mono.m3u8

Эта опция работает live-трансляций, VOD и DVR.

Например, для DVR плейлист можно запросить по следующей ссылке:

http://FLUSSONIC-IP/STREAM_NAME/archive-1643098810-30.m3u8?separate_audio=true

Ниже приведён пример такого плейлиста для DVR:

#EXTM3U
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="eng a1",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="eng",URI="tracks-a1/index-1643098810-30.m3u8"
#EXT-X-STREAM-INF:AUDIO="aac",CLOSED-CAPTIONS=NONE,RESOLUTION=320x240,FRAME-RATE=25.000,CODECS="avc1.420015,mp4a.40.2",AVERAGE-BANDWIDTH=240000,BANDWIDTH=300000
tracks-v1/index-1643098810-30.m3u8

DVR catchup playback

Когда ваш поток уже записан на сервере нашим DVR, вы можете воспроизвести видео через HLS, используя время начала и конца передачи (например, из EPG).

URL будет:

http://FLUSSONIC-IP/STREAM_NAME/archive-1659507585-3600.m3u8

Этот плейлист может иметь один из двух типов в зависимости от окончания указанного периода:

  1. Если конец периода находится в прошлом, плейлист будет иметь тип VOD (static). Он будет отдавать список сегментов начиная с UTC 1659507585 (3 августа 2022г, 06:19:45 GMT) и на один час вперед. Это будет завершенный плейлист, он не будет меняться со временем.
  2. Если же конец периода находится в настоящем или будущем, плейлист будет иметь тип EVENT (append-only). Он будет отдавать список сегментов начиная с UTC 1659507585 (3 августа 2022г, 06:19:45 GMT) вплоть до настоящего момента. К плейлисту со временем будут добавляться новые сегменты, а все предыдущие сегменты сохранятся. Если вы вызовете тот же самый URL спустя некоторое время, когда указанный конец периода окажется в прошлом – плейлист уже будет иметь тип VOD.

URL mono даст список сегментов, содержащих все дорожки, в MPEG-TS:

http://FLUSSONIC-IP/STREAM_NAME/mono-1659507585-3600.m3u8

Более конкретный videoN плейлист даст список сегментов с N видео дорожкой и всеми звуковыми дорожками:

http://FLUSSONIC-IP/STREAM_NAME/video1-1659507585-3600.m3u8

и variant видео плейлист со списком videoN плейлистов, который можно использовать в старых видеоприставках и VLC:

http://FLUSSONIC-IP/STREAM_NAME/video-1659507585-3600.m3u8

Note

Не используйте URL-адрес video для браузеров и современных клиентов. В большинстве случаев рекомендуем использовать стандартный URL-адрес archive для получения плейлиста для видео с нескольким битрейтами или несколькими языками.

HLS Event playlist

Вы можете запросить HLS Event плейлист по ссылке:

http://FLUSSONIC-IP/STREAM_NAME/index-1659507585-now.m3u8

Event плейлисты используются для того, чтобы дать клиенту возможность перемотатывать видео в рамках идущего мероприятия, например, вебинара, концерта или текущей ТВ программы. Такой плейлист будет отдавать список сегментов начиная с UTC 1659507585 (3 августа 2022г, 06:19:45 GMT) вплоть до настоящего момента. К плейлисту со временем будут добавляться новые сегменты, а все предыдущие сегменты сохранятся.

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

Перемотка плейлиста

Есть специальный плейлист "rewind-N.m3u8" с большим «скользящим» окном, позволяющий перематывать и ставить на паузу HLS потоки на долгие часы.

http://FLUSSONIC-IP/STREAM_NAME/rewind-7200.m3u8

7200 — длина HLS плейлиста в секундах. Это означает, что ваши клиенты могут поставить эфир на паузу на 2 часа или перемотать на начало футбольного матча без обращения по специальными архивным ссылкам.

DVR timeshift playback

Если у вас есть поток, записываемый на диск, но вы не настроили отложенный поток, вы можете проиграть видео со сдвигом по времени с помощью правильно построенного HLS адреса.

Cписок URL для относительного таймшифта:

/timeshift_rel-3600.m3u8
/mono-timeshift_rel-3600.m3u8
/video-timeshift_rel-3600.m3u8
/video1-timeshift_rel-3600.m3u8

и для абсолютного таймшифта:

/timeshift_abs-1508403742.m3u8
/mono-timeshift_abs-1508403742.m3u8
/video-timeshift_abs-1508403742.m3u8
/video1-timeshift_abs-1508403742.m3u8

Воспроизведение отдельных дорожек

Если у потока есть несколько аудио- и видеодорожек, то можно указать, какие именно дорожки следует отдавать. Для этого укажите номера дорожек, добавив строку запроса с параметром filter.tracks к URL потока.

Примеры:

Выбрать первую аудио- и вторую видеодорожки:

http://FLUSSONIC-IP/STREAM_NAME/index.m3u8?filter.tracks=v2a1

Выбрать только видео:

http://FLUSSONIC-IP/STREAM_NAME/index.m3u8?filter.tracks=v1

Проигрывание отрывка длиной 3600 секунд из DVR архива, начиная со времени UTC 1362504585:

http://FLUSSONIC-IP/STREAM_NAME/archive-1362504585-3600.m3u8?filter.tracks=v2a1

Сортировка треков в мультибитрейтном плейлисте

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

Если вы хотите изменить порядок треков и начать проигрывание с другого трека, вы можете использовать для этого параметр filter.tracks. Укажите в этом параметре номера видео- и аудиотреков в нужном порядке, и в результате треки в плейлисте будут отсортированы соответственно. Например:

http://FLUSSONIC-IP/STREAM_NAME/index.m3u8?filter.tracks=v3v2v1a2a1

В этом случае треками по умолчанию будут v3 и a2.

Добавление скриншотов в плейлист HLS

В плейлист HLS можно добавить скриншоты как специальные теги, которые сможет прочитать плеер. Это можно сделать как для потока с включенным DVR, так и для VOD-файла.

Чтобы добавить скриншоты в плейлист, добавьте в URL потока или VOD-файла опцию ?thumbnails=.

Пример для окна DVR потока:

http://flussonic:80/ort/index-1644304617-60.m3u8?thumbnails=50

Пример для VOD-файла:

http://flussonic:80/vod/bunny.mp4/index.m3u8?thumbnails=100

Указанное значение определяет, сколько ссылок на скриншоты будет добавлено в плейлист, чтобы покрыть продолжительность окна DVR или VOD-файла соответственно. Плеер добавит на полосу проигрывания скриншоты через равные интервалы времени. Продолжительность интервала между скриншотами равна всей продолжительности окна DVR или VOD-файла, разделенной на это значение.

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

Для работы этой опции в настройках потока или VOD-файла необходимо указать параметры thumbnails enabled=ondemand и size (размер скриншотов). Например: thumbnails enabled=ondemand size=320x240;. Можно указать несколько размеров через пробел, например, size=320x250 size=640x480. В этом случае в плейлист будет включено несколько треков со скриншотами. Каждый скриншот в соответствующем треке будет пропорционально уменьшен, чтобы уместиться в указанный размер.

Больше информации можно найти в схеме Streaming API.