...
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 потоком | [] |
...
В ответ на запросы /hls/find_all
, /hls/profiles
, /hls/subscribers
возвращаются текущие количество и состав HLS подписчиков с точностью до вкладки браузера. Однако количество сетевых соединений для загрузки HLS, которое отображается на странице статистики серверабраузера. Однако количество сетевых соединений для загрузки HLS, которое отображается на странице статистики сервера
Code Block | ||||
---|---|---|---|---|
| ||||
curl -s http://localhost:8081/?action=stat¶ms=connections_hls |
может отличаться от количества подписчиков. В большинстве случаев, HLS подписчики используют HTTP 2 протокол, и все вкладки одного браузера, которые получают HLS потоки с одного WCS сервера, будут использовать одно соединение.
При этом количество соединений, отображаемое параметром connections_hls
, соответствует количеству установленных соединений на HLS порт, отображаемых командой netstat
:
Code Block | ||||
---|---|---|---|---|
| ||||
sudo netstat -np | grep ESTABLISHED | grep java | grep 8445 |
Здесь 8445 - HTTPS HLS порт WCS сервера
Отображение HLS клиентов, подключенных к серверу
В сборке 5.2.1968 добавлена возможность выводить список HLS клиентов, подключенных в данный момент к серверу. Этот список возвращается в ответ на запрос /hls/connections
:
Code Block | ||||
---|---|---|---|---|
| ||||
[
{
"ip": "192.168.0.83",
"port": 51708,
"userAgent": "Mozilla/5.0 (X11; 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 | ||||
---|---|---|---|---|
| ||||
curl -s 'http://localhostwcs:8081/?action=stat¶ms=connections_hls |
может отличаться от количества подписчиков. В большинстве случаев, HLS подписчики используют HTTP 2 протокол, и все вкладки одного браузера, которые получают HLS потоки с одного WCS сервера, будут использовать одно соединение.
При этом количество соединений, отображаемое параметром connections_hls
, соответствует количеству установленных соединений на HLS порт, отображаемых командой netstat
:
Code Block | ||||
---|---|---|---|---|
| ||||
sudo netstat -np | grep ESTABLISHED | grep java | grep 8445 |
...
params=connections_hls' |
Запись сегментов на диск для отладки
...
В сборке 5.2.1920 добавлена настройка, управляющая остановкой HLS провайдера при остановке публикации исходного потока. По умолчанию в этом случае 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_delayedtime_shutdownmin=true |
...
2000 |
В сборке 5.2.1974 добавлена возможность включить нарезку только по получению ключевых кадров
Code Block | ||
---|---|---|
| ||
hls_list_size=12 |
Таким образом, при остановке исходного потока тем подписчикам, которые уже его играют, дается возможность доиграть уже нарезанные сегменты.
...
always_start_segment_with_key_frame=true |
При этом размер сегмента может превышать hls_time_min
, однако минимальный размер сегмента может быть и меньше этого значения. Для того, чтобы ограничить минимальную длительность сегментов, используется настройка
Code Block | ||
---|---|---|
| ||
hls_delayed_shutdown=falsekeep_min_segment_duration=true |
В этом случае HLS провайдер будет остановлен стразу при остановке исходной публикацииразмер сегмента будет не меньше, чем hls_time_min
.
Известные проблемы
1. Невосстанавливаемый фриз HLS потока при воспроизведении в iOS Safari через CDN
...