...
Code Block | ||
---|---|---|
| ||
location ~* ^.+.(ts)$ { proxy_pass https://localhost:8445; proxy_http_version 1.1; proxy_set_header Host $server_name:$server_port; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_cache proxy_cache; proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 2m; } location ~* ^.+.(m3u8)$ { proxy_pass https://localhost:8445; proxy_http_version 1.1; proxy_set_header Host $server_name:$server_port; proxy_set_header X-Forwarded-Host $http_host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_cache off; expires -1; } |
Отображение статических HTML страниц на порту HLS
...
Передача собственных параметров при запросе плейлиста
Если на обратном прокси сервере настроена авторизация зрителей, необходимо передавать собственные параметры при запросе плейлиста:
Code Block | ||
---|---|---|
| ||
hls_static_enabled=true |
Страница плеера должна располагаться в каталоге, определяемом настройкой
Code Block | ||
---|---|---|
| ||
hls_static_dir=client2/examples/demo/streaming/hls_static |
...
https://wcs:8445/test/test.m3u8?key1=value1&key2=value2 |
Передача собственных параметров поддерживается, начиная со сборки 5.2.1959. При этом переданные параметры будут указаны в плейлистах для каждого сегмента, это дает возможность корректно провести авторизацию на прокси сервере.
В плейлистах, кроме собственных параметров, будет также параметр sessionId
, например
Code Block | ||
---|---|---|
| ||
hlsav_statictest_dir=/var/www/html/hls_static |
...
o/av_test_o.m3u8?sessionId=11&key1=value1&key2=value2 |
Это внутренний параметр WCS, используемый для идентификации подписчика с целью вывода статистики.
Отображение статических HTML страниц на порту HLS
Еще один способ обхода ограничений на кросс-доменные запросы в браузере - отображение статического контента, например, страницы плеера, на том же порту, который отдает HLS контент. Чтобы включить данную возможность, необходимо указать следующую настройку в файле flashphoner.properties
Code Block | ||
---|---|---|
| ||
hls_static_enabled=true |
Страница плеера должна располагаться в каталоге, определяемом настройкой
Code Block | ||
---|---|---|
| ||
hls_static_dir=client2/examples/demo/streaming/hls_static |
В данном случае (по умолчанию), путь к файлам страницы указан относительно каталога установки WCS. Может быть указан и полный путь, например
Code Block | ||
---|---|---|
| ||
hls_static_dir=/var/www/html/hls_static |
Если отображение статического контента включено, при обращении к WCS серверу по адресу https://host:8445/hls-player.html браузер отобразит страницу HLS плеера. Если данная возможность отключена, при обращении по такому адресу сервер вернет ошибку 404 Not found.
...
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/hls/startup |
| 200 - OK 404 - Stream not found 500 - Internal error | Запустить HLS нарезку указанного потока | |||||||||||||||
/hls/find_all |
|
| 200 – OK 404 – Not found | Найти все потоки, для которых есть HLS нарезки | ||||||||||||||
/hls/terminate |
| 200 – OK 404 – Not found | Завершить или перезапустить HLS нарезку указанного потока | |||||||||||||||
/hls/profiles |
|
| 200 – OK 400 – Bad request 404 – Not found | Получить статистику профиля нарезки HLS | ||||||||||||||
/hls/subscribers |
|
| 200 – OK 400 – Bad request 404 – Not found | Получить список подписчиков на HLS нарезку | ||||||||||||||
/hls/enableRecordingconnections |
|
| 200 – OK 400 – Bad request 404 – Not found409 - Conflict 500 - Internal server error | Включить запись сегментов HLS-потока на дискПолучить список HLS клиентов, подключенных к серверу | ||||||||||||||
/hls/disableRecordingenableRecording |
| 200 – OK 400 – Bad request 404 – Not found Остановить409 - Conflict 500 - Internal server error | Включить запись сегментов HLS-потока на диск |
Параметры
Имя параметра | Описание | Пример | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
name | Имя потока, опубликованного на сервере | test | |||||||||
/hls/disableRecording |
| 200 – OK 400 – Bad request 404 – Not found | Остановить запись сегментов HLS-потока на диск |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
name | Имя потока, опубликованного на сервере | test |
hlsId | Имя потока, опубликованного на сервере | test |
profileName | Имя профиля качества, для которого запрашивается статистика | v_test |
offset | Смещение от начала списка потоков в ответе на запрос статистики | 0 |
size | Максимальное количество потоков в ответе на запрос статистики | 10 |
ids | Список имен HLS-потоков, для которых включается/останавливается запись сегментов на диск | [ "test", "test-HLS-ABR-STREAM" ] |
state | Статус HLS нарезки | ACTIVE |
logs | Сообщения о проблемах с LL HLS потоком | [] |
...
Здесь 8445 - HTTPS HLS порт WCS сервера
...
Отображение HLS клиентов, подключенных к серверу
В сборке 5.2.19131968 добавлена возможность записать сегменты и плейлисты определенного потока, который уже играют подписчики, на диск в целях отладки. Запись производится в каталог, указанный настройкой
Code Block | ||
---|---|---|
| ||
hls_debug_dir=hls-debug |
Запись сегментов определенного потока запускается при помощи REST API запроса /hls/enableRecording
выводить список HLS клиентов, подключенных в данный момент к серверу. Этот список возвращается в ответ на запрос /hls/connections
:
Code Block | ||||
---|---|---|---|---|
| ||||
POST /rest-api/hls/enableRecording HTTP/1.1 Host: localhost:8081 Content-Type: application/json [ { "idsip": [ "192.168.0.83", "testport": 51708, "userAgent": "Mozilla/5.0 (X11; "test-HLS-ABR-STREAM" ] } |
...
Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
] |
Здесь:
- ip - адрес клиента
- port - исходящий порт клиента
- userAgent - заголовок
User-Agent
, присланный клиентом
Для HTTPS клиентов все вкладки одного и того же браузера на одном и том же ПК будут представлены одной позицией в списке, посколько HTTP/2 предусматривает использование одного и того же TCP соедиения для всех HTTPS соединений.
Количество клиентов в списке будет соответствовать параметру статистики
Code Block | ||||
---|---|---|---|---|
| ||||
POSTcurl /rest-api/hls/disableRecording HTTP/1.1 Host: localhost:8081 Content-Type: application/json -s 'http://wcs:8081/?action=stat¶ms=connections_hls' |
Запись сегментов на диск для отладки
В сборке 5.2.1913 добавлена возможность записать сегменты и плейлисты определенного потока, который уже играют подписчики, на диск в целях отладки. Запись производится в каталог, указанный настройкой
Code Block | ||
---|---|---|
| ||
hls_debug_dir=hls-debug |
Запись сегментов определенного потока запускается при помощи REST API запроса /hls/enableRecording
Code Block | ||||
---|---|---|---|---|
| ||||
POST /rest-api/hls/enableRecording HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"ids": [
"test",
"test-HLS-ABR-STREAM"
]
} |
С записанными сегментами можно работать Для остановки записи используется REST API запрос /hls/disableRecording
Code Block | ||||
---|---|---|---|---|
| ||||
POST /rest-api/hls/disableRecording HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"ids": [
"test",
"test-HLS-ABR-STREAM"
]
} |
С записанными сегментами можно работать различными инструментами, предназначенными для разбора и проигрывания медиафайлов: ffmpeg, ffprobe и т.п. Кроме того, записанный поток можно проиграть с сервера по URL с суффиксом -DEBUG
...
Cледующие настройки применяются только к LL HLS и не применяются к не LL HLS
Параметр | Описание | Значение по умолчанию |
---|---|---|
ll_hls_max_number_of_parent_segments_containing_partials | Максимальное число частичных сегментов для одного основного сегмента | 5 |
ll_hls_part_hold_back_count | Значение атрибута PART-HOLD-BACK в плейлисте | 6 |
ll_hls_partial_time_max | Максимальный размер одного частичного сегмента в миллисекундах | 400 |
Поддержка m4s контейнера
В сборке 5.2.1626 добавлена поддержка m4s контейнера для нарезки HLS сегментов, а в сборке 5.2.1632 поддержка данного контейнера включена и для HLS ABR
...
Code Block | ||
---|---|---|
| ||
https://wcs:8445/stream-HLS-ABR-STREAM/stream-HLS-ABR-STREAM.m3u8 |
...
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 |
Остановка HLS провайдера при остановке публикации
В сборке 5.2.1920 добавлена настройка, управляющая остановкой HLS провайдера при остановке публикации исходного потока. По умолчанию в этом случае HLS провайдер останавливается с задержкой
Code Block | ||
---|---|---|
| ||
hls_delayed_shutdown=true |
Задержка зависит от размера плейлиста
Code Block | ||
---|---|---|
| ||
hls_list_size=8 |
Таким образом, при остановке исходного потока тем подписчикам, которые уже его играют, дается возможность доиграть уже нарезанные сегменты.
При необходимости, задержку можно отключить
Code Block | ||
---|---|---|
| ||
hls_delayed_shutdown=false |
В этом случае HLS провайдер будет остановлен стразу при остановке исходной публикации.
Управление нарезкой HLS сегментов
По умолчанию сегменты нарезаются либо по получению очередного ключевого кадра, либо по достижении сегментом размера, заданного настройкой (по умолчанию 2000 мс)
Code Block | ||
---|---|---|
| ||
hls_time_min=2000 |
В сборке 5.2.1974 добавлена возможность включить нарезку только по получению ключевых кадров
Code Block | ||
---|---|---|
| ||
hls_always_start_segment_with_key_frame=true |
При этом размер сегмента может превышать hls_time_min
, однако минимальный размер сегмента может быть и меньше этого значения. Для того, чтобы ограничить минимальную длительность сегментов, используется настройка
Code Block | ||
---|---|---|
| ||
hls_path_template={streamName}/playlist.m3u8 hls_abr_path_template={streamName}/playlist{abrSuffix}.m3u8keep_min_segment_duration=true |
В этом случае для получения манифеста HLS потока будет использоваться URL
Code Block | ||
---|---|---|
| ||
https://wcs:8445/stream/playlist.m3u8 |
а для HLS ABR потока
...
theme | RDark |
---|
...
размер сегмента будет не меньше, чем hls_time_min
.
Известные проблемы
1. Невосстанавливаемый фриз HLS потока при воспроизведении в iOS Safari через CDN
...