...
При необходимости, любой из потоков, опубликованных на сервере по WebRTC, RTMP, MPEG-TS, или захваченный из RTSP или RTMP RTMP источника по REST API, может автоматически нарезаться на HLS сегменты. Эта возможность включается настройкой
Code Block |
---|
|
hls_auto_start=true |
В сборке 5.2.1895 добавлена возможность автоматической нарезки HLS ABR, при условии, что используется HLS ABR на одном узле. Эта возможность включается настройкой
Code Block |
---|
|
hls_abr_auto_start=true |
Аутентификация воспроизведения HLS с помощью REST hook
...
При этом, если в настройке встречаются два профиля с одинаковыми названиями, сервер будет использовать только последний из профилей с одинаковыми именами.
Максимальный размер плейлиста
...
Транскодирование максимального качества только при наличии B-фреймов в исходном потоке
Для того, чтобы снизить нагрузку на сервер при кодировании видео, в сборке 5.2.1840 добавлена возможность транскодировать максимальное ABR качество (которое обычно соответствует оригинальному разрешению потока) только при наличии B-фреймов в потоке. Эта возможность включается настройкой
Code Block |
---|
|
hls_list_size=8 |
По умолчанию размер HLS плейлиста равен 8 сегментам. Отметим, что, когда нарезка HLS только стартовала, количество сегментов в первых плейлистах будет меньше заданного.
Хранение сегментов HLS
Использование диска
В сборках до 5.2.1713 HLS-сегменты по умолчанию записываются на диск сервера, в каталог /usr/local/FlashphonerWebCallServer/hls
. Начиная со сборки 5.2.687, каталог для сохранения сегментов можно изменить при помощи параметра
Code Block |
---|
|
hls_dir=/usr/local/FlashphonerWebCallServer/hls |
(Расположение прелоадера настраивается отдельно при помощи параметра hls_preloader_dir
.)
На диске хранится количество сегментов, соответствующее заданному размеру плейлиста. Чем меньше количество сегментов в плейлисте, тем меньше задержка при воспроизведении. Однако при коротком плейлисте подписчики с недостаточной пропускной способностью каналов могут запрашивать сегменты, которых уже нет в плейлисте и на диске. В связи с этим, в сборке 5.2.581 добавлена возможность хранить некоторое число сегментов на диске после их ухода из плейлиста. Эта возможность включается настройкой
Code Block |
---|
|
hls_hold_segments_before_delete=true |
По умолчанию, будет храниться 5 последних сегментов
Code Block |
---|
|
hls_hold_segments_size=5 |
...
h264_b_frames_force_transcoding=true |
При этом сервер проверяет наличие B-фреймов в исходном потоке, анализируя заданное количество фреймов (по умолчанию 10)
Code Block |
---|
|
frame_cnt_to_determine_their_type=10 |
Если в потоке есть B-фреймы, максимальное ABR качество будет транскодироваться, и будет доступно плееру в HLS манифесте
Code Block |
---|
|
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
720/720.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080,CODECS="avc1.42e01f,mp4a.40.2"
1080/1080.m3u8 |
Если в потоке нет B-фреймов, максимальное ABR качество не будет транскодироваться
Code Block |
---|
|
#EXTM3U
#EXT-X-VERSION:8
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:15STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8
#EXT-X-DISCONTINUITYSTREAM-SEQUENCE:1
#EXTINF:3.415,
test_017.ts
#EXTINF:10.417,
test_018.ts
#EXTINF:9.084,
test_019.ts |
на диске будут храниться 3 текущих сегмента из плейлиста и 5 предшествующих
Code Block |
---|
|
test_012.ts
test_013.ts
test_014.ts
test_015.ts
test_016.ts
test_017.ts
test_018.ts
test_019.ts |
Использование оперативной памяти
...
INF:BANDWIDTH=2000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
720/720.m3u8 |
В этом случае оригинальное качество необходимо запросить отдельно с клиента.
Начиная со сборки 5.2.1916, эта возможность доступна и для HLS ABR в CDN. Для этого все серверы в CDN должны быть обновлены до сборки 5.2.1916 или новее, и на Edge сервере указаны следующие настройки
Code Block |
---|
|
hlscdn_storestrict_segmenttranscoding_in_memory=true |
Для отправки подписчикам сегменты будут считываться из памяти. Необходимо отметить, что в этом случае потребуется больше памяти под Java heap для хранения сегментов.
В сборке 5.2.1713 хранение сегментов в оперативной памяти включено по умолчанию.
Отладочные логи для HLS-сессии
Для отчета об ошибке можно, используя CLI, включить сбор отладочных логов для HLS-сессий
Code Block |
---|
|
update node-setting --value true hls_enable_session_debug |
Следует учесть, что файл настроек flashphoner.properties будет перезаписан после этой команды.
Поддержка Low Latency HLS
boundaries=true
h264_b_frames_force_transcoding=true |
Максимальный размер плейлиста
Максимальный размер плейлиста в сегментах задается настройкой
Code Block |
---|
|
hls_list_size=8 |
По умолчанию размер HLS плейлиста равен 8 сегментам. Отметим, что, когда нарезка HLS только стартовала, количество сегментов в первых плейлистах будет меньше заданного.
Хранение сегментов HLS
Использование диска
В сборках до 5.2.1713 HLS-сегменты по умолчанию записываются на диск сервера, в каталог /usr/local/FlashphonerWebCallServer/hls
. Начиная со сборки 5.2.1181, поддерживается Low Latency HLS (LL HLS). Эта возможность включается при помощи настройки687, каталог для сохранения сегментов можно изменить при помощи параметра
Code Block |
---|
|
hls_ll_enabled=true
hls_new_http_stack=true |
В этом случае плееры, которые поддерживают LL HLS (например, HLS.JS), будут играть дополнительные HLS сегменты и давать меньшую задержку по сравнению с плеерами, которые их не играют (например, VideoJS).
Для того, чтобы LL HLS проигрывался корректно, необходимо, как и для обычного HLS, обеспечить стабильный FPS публикуемого потока и стабильный интервал между ключевыми кадрами. Таким образом, исходный поток рекомендуется публиковать как RTMP с параметрами
Image Removed
Image Removed
Рекомендованные настройки сервера для LL HLS
...
dir=/usr/local/FlashphonerWebCallServer/hls |
(Расположение прелоадера настраивается отдельно при помощи параметра hls_preloader_dir
.)
На диске хранится количество сегментов, соответствующее заданному размеру плейлиста. Чем меньше количество сегментов в плейлисте, тем меньше задержка при воспроизведении. Однако при коротком плейлисте подписчики с недостаточной пропускной способностью каналов могут запрашивать сегменты, которых уже нет в плейлисте и на диске. В связи с этим, в сборке 5.2.581 добавлена возможность хранить некоторое число сегментов на диске после их ухода из плейлиста. Эта возможность включается настройкой
Code Block |
---|
|
hls_ll_enabled=true
hls_auto_start=true
hls_preloader_enabled=false
hls_player_width=848
hls_player_height=480
video_filter_enable_fps=true
video_filter_fps=30
video_encoder_h264_gop=60 |
Использование HTTP/2 и HTTP/1
...
hold_segments_before_delete=true |
По умолчанию, будет храниться 5 последних сегментов
Code Block |
---|
|
hls_hold_segments_size=5 |
Например, если плейлист содержит 3 сегмента
Code Block |
---|
|
https://wsc:8445/test/test.m3u8 |
...
#EXTM3U
#EXT-X-VERSION:8
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:15
#EXT-X-DISCONTINUITY-SEQUENCE:1
#EXTINF:3.415,
test_017.ts
#EXTINF:10.417,
test_018.ts
#EXTINF:9.084,
test_019.ts |
на диске будут храниться 3 текущих сегмента из плейлиста и 5 предшествующих
Code Block |
---|
|
http://wsc:8082/test/test.m3u8 |
Отметим, что LL HLS через HTTP/1 работает во всех основных браузерах, кроме Safari, поэтому не рекомендуется использовать эту возможность в промышленной эксплуатации.
Каталог для нарезки сегментов LL HLS
...
test_012.ts
test_013.ts
test_014.ts
test_015.ts
test_016.ts
test_017.ts
test_018.ts
test_019.ts |
Использование оперативной памяти
При больших нагрузках на сервер, например, если он выделен для раздачи потоков по HLS, чтение сегментов с диска для отправки подписчикам может давать задержки. В этом случае необходимо включить хранение HLS сегментов в памяти
Code Block |
---|
|
ll_hls_dir=/usr/local/FlashphonerWebCallServer/ll-hls |
При изменении местоположения, например
Code Block |
---|
|
ll_hls_dir=/opt/ll-hls |
...
hls_store_segment_in_memory=true |
Для отправки подписчикам сегменты будут считываться из памяти. Необходимо отметить, что в этом случае потребуется больше памяти под Java heap для хранения сегментов.
В сборке 5.2.1713 хранение сегментов в оперативной памяти включено по умолчанию.
Отладочные логи для HLS-сессии
Для отчета об ошибке можно, используя CLI, включить сбор отладочных логов для HLS-сессий
Code Block |
---|
|
/usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions |
и перезапустить WCS, чтобы применить изменения.
Максимальный размер LL HLS плейлиста
...
update node-setting --value true hls_enable_session_debug |
Следует учесть, что файл настроек flashphoner.properties будет перезаписан после этой команды.
Поддержка Low Latency HLS
Начиная со сборки 5.2.1181, поддерживается Low Latency HLS (LL HLS). Эта возможность включается при помощи настройки
Code Block |
---|
|
hls_ll_enabled=true
hls_new_listhttp_sizestack=12 |
По умолчанию размер LL HLS плейлиста равен 12 полным сегментам. Отметим, что, когда нарезка HLS только стартовала, количество полных сегментов в первых плейлистах будет меньше заданного.
Прелоадер для LL HLS
...
В этом случае плееры, которые поддерживают LL HLS (например, HLS.JS), будут играть дополнительные HLS сегменты и давать меньшую задержку по сравнению с плеерами, которые их не играют (например, VideoJS).
Для того, чтобы LL HLS проигрывался корректно, необходимо, как и для обычного HLS, может использоваться прелоадеробеспечить стабильный FPS публикуемого потока и стабильный интервал между ключевыми кадрами. Таким образом, исходный поток рекомендуется публиковать как RTMP с параметрами
Image Added
Image Added
Рекомендованные настройки сервера для LL HLS
Начиная со сборки 5.2.1345, рекомендуются следующие настройки для проигрывания Low latency HLS:
Code Block |
---|
|
hls_preloaderll_enabled=true |
Файлы прелоадера LL HLS по умолчанию помещаются в каталог
Code Block |
---|
|
ll_
hls_auto_start=true
hls_preloader_dir=/usr/local/FlashphonerWebCallServer/ll-hls/.preloader |
Расположение может быть изменено, например
Code Block |
---|
|
ll_hls_preloader_dir=/opt/preloader |
...
enabled=false
hls_player_width=848
hls_player_height=480
video_filter_enable_fps=true
video_filter_fps=30
video_encoder_h264_gop=60 |
Использование HTTP/2 и HTTP/1
Согласно спецификации, LL HLS должен воспроизводиться с использованием HTTP/2, то есть через безопасное соединение
Code Block |
---|
|
16x9.mp4
2x1.mp4
4x3.mp4 |
...
https://wsc:8445/test/test.m3u8 |
В WCS также возможно использование HTTP/1 через небезопасное соединение
Code Block |
---|
|
hls_preloader_enabled=false |
Настройка собственного прелоадера
При необходимости, для LL HLS может быть настроен собственный прелоадер. Для этого необходимо подготовить файлы в трех основных аспектах 16:9, 4:3 и 2:1 согласно следующим требованиям:
- контейнер MP4, кодек видео H264, кодек аудио AAC
- файлы должны позволять немедленное проигрывание (MP4 атом
moov
должен быть перед атомом mdat
) - файлы не должны содержать B-фреймов
- длительность файла должна быть около 1 минуты
- файл должен иметь ровный FPS
- интервал между ключевыми кадрами должен быть около 2 секунд
Предполагается, что исходные файлы уже записаны в нужном аспекте, например, при помощи OBS Studio или подготовлены в видеоредакторе. Пример команды для преобразования файла под указанные требования:
Code Block |
---|
|
ffmpeg -i 16x9-source.mp4 -bf 0 -acodec aac -vcodec h264 -preset ultrafast -g 60 -strict -2 -r 30 -ar 48000 -movflags faststart -ss 00:00:00 -t 00:01:00 16x9.mp4 |
Затем подготовленными файлами необходимо заменить файлы прелоадера по умолчанию и перезапустить WCS.
Для восстановления прелоадера по умолчанию достаточно удалить файлы собственного прелоадера и перезапустить WCS.
Поддержка m4s контейнера
В сборке 5.2.1626 добавлена поддержка m4s контейнера для нарезки HLS сегментов, а в сборке 5.2.1632 поддержка данного контейнера включена и для HLS ABR
Code Block |
---|
|
ll_hls_fragmented_mp4=true |
Начиная со сборки 5.2.1724, контейнер m4s поддерживается и для HLS ABR в CDN.
При необходимости, можно переключиться на использование ts контейнера
Code Block |
---|
|
ll_hls_fragmented_mp4=false |
Использование общего сетевого стека для обычного и Low Latency HLS
В сборке 5.2.1749 добавлена настройка, разрешающая использование унифицированного сетевого стека для обычного HLS и Low latency HLS. Эта настройка включена по умолчанию:
Code Block |
---|
|
use_new_hls=true |
При этом:
- по умолчанию используется контейнер m4s для записи сегментов
- настройки с префиксом
hls
применяются и к обычному HLS, и к LL HLS - настройки с префиксом
ll_hls
применяются к LL HLS и к контейнеру m4s
Warning |
---|
Начиная со сборки 5.2.1793, данная настройка удалена. Для доставки HLS и LL HLS сегментов используется унифицированный сетевой стек.http://wsc:8082/test/test.m3u8 |
Отметим, что LL HLS через HTTP/1 работает во всех основных браузерах, кроме Safari, поэтому не рекомендуется использовать эту возможность в промышленной эксплуатации.
Каталог для нарезки сегментов LL HLS
По умолчанию, сегменты LL HLS помещаются в подкаталоги с именами потоков в каталог
Code Block |
---|
|
ll_hls_dir=/usr/local/FlashphonerWebCallServer/ll-hls |
При изменении местоположения, например
Code Block |
---|
|
ll_hls_dir=/opt/ll-hls |
необходимо назначить права доступа командой
Code Block |
---|
|
/usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions |
и перезапустить WCS, чтобы применить изменения.
Максимальный размер LL HLS плейлиста
Максимальный размер LL HLS плейлиста в сегментах задается настройкой
Code Block |
---|
|
ll_hls_list_size=12 |
По умолчанию размер LL HLS плейлиста равен 12 полным сегментам. Отметим, что, когда нарезка HLS только стартовала, количество полных сегментов в первых плейлистах будет меньше заданного.
Прелоадер для LL HLS
Начиная со сборки 5.2.1729, для LL HLS, как и для обычного HLS, может использоваться прелоадер
Code Block |
---|
|
hls_preloader_enabled=true |
Файлы прелоадера LL HLS по умолчанию помещаются в каталог
Code Block |
---|
|
ll_hls_preloader_dir=/usr/local/FlashphonerWebCallServer/ll-hls/.preloader |
Расположение может быть изменено, например
Code Block |
---|
|
ll_hls_preloader_dir=/opt/preloader |
По умолчанию, LL HLS прелоадер состоит из следующих файлов, по одному на каждое соотношение сторон видео потоков
Code Block |
---|
|
16x9.mp4
2x1.mp4
4x3.mp4 |
Если соотношение сторон публикуемого потока неизвестно, используется прелоадер с соотношением 16:9. Если файлы прелоадера отстутствуют, нарезка LL HLS будет начинаться без прелоадера, аналогично настройке
Code Block |
---|
|
hls_preloader_enabled=false |
Настройка собственного прелоадера
При необходимости, для LL HLS может быть настроен собственный прелоадер. Для этого необходимо подготовить файлы в трех основных аспектах 16:9, 4:3 и 2:1 согласно следующим требованиям:
- контейнер MP4, кодек видео H264, кодек аудио AAC
- файлы должны позволять немедленное проигрывание (MP4 атом
moov
должен быть перед атомом mdat
) - файлы не должны содержать B-фреймов
- длительность файла должна быть около 1 минуты
- файл должен иметь ровный FPS
- интервал между ключевыми кадрами должен быть около 2 секунд
Предполагается, что исходные файлы уже записаны в нужном аспекте, например, при помощи OBS Studio или подготовлены в видеоредакторе. Пример команды для преобразования файла под указанные требования:
Code Block |
---|
|
ffmpeg -i 16x9-source.mp4 -bf 0 -acodec aac -vcodec h264 -preset ultrafast -g 60 -strict -2 -r 30 -ar 48000 -movflags faststart -ss 00:00:00 -t 00:01:00 16x9.mp4 |
Затем подготовленными файлами необходимо заменить файлы прелоадера по умолчанию и перезапустить WCS.
Для восстановления прелоадера по умолчанию достаточно удалить файлы собственного прелоадера и перезапустить WCS.
Поддержка m4s контейнера
В сборке 5.2.1626 добавлена поддержка m4s контейнера для нарезки HLS сегментов, а в сборке 5.2.1632 поддержка данного контейнера включена и для HLS ABR
Code Block |
---|
|
ll_hls_fragmented_mp4=true |
Начиная со сборки 5.2.1724, контейнер m4s поддерживается и для HLS ABR в CDN.
При необходимости, можно переключиться на использование ts контейнера
Code Block |
---|
|
ll_hls_fragmented_mp4=false |
Использование общего сетевого стека для обычного и Low Latency HLS
В сборке 5.2.1749 добавлена настройка, разрешающая использование унифицированного сетевого стека для обычного HLS и Low latency HLS. Эта настройка включена по умолчанию:
Code Block |
---|
|
use_new_hls=true |
При этом:
- по умолчанию используется контейнер m4s для записи сегментов
- настройки с префиксом
hls
применяются и к обычному HLS, и к LL HLS - настройки с префиксом
ll_hls
применяются к LL HLS и к контейнеру m4s
Warning |
---|
Начиная со сборки 5.2.1793, данная настройка удалена. Для доставки HLS и LL HLS сегментов используется унифицированный сетевой стек. |
Настройка URL манифеста
Начиная со сборки 5.2.1852, можно задать шаблоны URL, по которому должен запрашиваться основной плейлист (манифест) потока. По умолчанию используются следующие шаблоны:
Code Block |
---|
|
hls_path_template={streamName}/{streamName}.m3u8
hls_abr_path_template={streamName}{abrSuffix}/{streamName}{abrSuffix}.m3u8 |
Здесь:
- streamName - имя потока, опубликованного на сервере
- abrSuffix - суффикс для ABR потока, заданный настройкой
hls_abr_stream_name_suffix
В этом случае для получения манифеста HLS потока используется URL
Code Block |
---|
|
https://wcs:8445/stream/stream.m3u8 |
а для HLS ABR потока
Code Block |
---|
|
https://wcs:8445/stream-HLS-ABR-STREAM/stream-HLS-ABR-STREAM.m3u8 |
Если необходимо, например, задать фиксированное имя манифеста и при этом различать ABR и не ABR потоки, можно задать следующие шаблоны
Code Block |
---|
|
hls_path_template={streamName}/playlist.m3u8
hls_abr_path_template={streamName}/playlist{abrSuffix}.m3u8 |
В этом случае для получения манифеста HLS потока будет использоваться URL
Code Block |
---|
|
https://wcs:8445/stream/playlist.m3u8 |
а для HLS ABR потока
Code Block |
---|
|
https://wcs:8445/stream/playlist-HLS-ABR-STREAM.m3u8 |
Известные проблемы
1. Невосстанавливаемый фриз HLS потока при воспроизведении в iOS Safari через CDN
...
Решение: начиная со сборки 5.2.1690, использовать контейнер m4s для потоков только с аудио
13. При использовании HLS ABR под нагрузкой может возникать утечка ресурсов кодирования
Симптомы: при использовании HLS ABR, при большой нагрузке на CPU сервера (например, общее число профилей кодирования для всех опубликованных потоков превышает возможности CPU), после остановки публикаций ресурсы кодирования могут не освобождаться, это видно в статистике, например
Code Block |
---|
|
streams_hls=0
...
native_resources.video_encoders=5 |
Решение: обновить WCS до сборки 5.2.1947 и установить следующий параметр
Code Block |
---|
|
handler_async_disconnect=false |