Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
themeRDark
		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
themeRDark
hls_static_enabled=true

Страница плеера должна располагаться в каталоге, определяемом настройкой

Code Block
themeRDark
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
themeRDark
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
themeRDark
hls_static_enabled=true

Страница плеера должна располагаться в каталоге, определяемом настройкой

Code Block
themeRDark
hls_static_dir=client2/examples/demo/streaming/hls_static

В данном случае (по умолчанию), путь к файлам страницы указан относительно каталога установки WCS. Может быть указан и полный путь, например

Code Block
themeRDark
hls_static_dir=/var/www/html/hls_static

Если отображение статического контента включено, при обращении к WCS серверу по адресу  https://host:8445/hls-player.html браузер отобразит страницу HLS плеера. Если данная возможность отключена, при обращении по такому адресу сервер вернет ошибку 404 Not found.

...

REST-метод

Пример тела REST-запроса

Пример тела REST-ответа

Статусы ответа

Описание

/hls/startup

Code Block
languagejs
themeRDark
{
  "name":"test"
}

200 - OK

404 - Stream not found

500 - Internal error


Запустить HLS нарезку указанного потока


/hls/find_all

Code Block
languagejs
themeRDark
{
  "offset":0,
  "size":10
}
Code Block
languagejs
themeRDark
[{
    "id": "test",
    "streamName": "test",
    "status": "ACTIVE",
    "waitingSize": 0,
    "profiles": [
      "a_test",
      "v_test"
    ],
    "subscribers": 1,
    "playlist": "...",
    "createdDate": 1697605114475,
    "logs": []
}]

200 – OK

404 – Not found

Найти все потоки, для которых есть HLS нарезки

/hls/terminate

Code Block
languagejs
themeRDark
{
  "name":"test"
}

200 – OK

404 – Not found

Завершить или перезапустить HLS нарезку указанного потока

/hls/profiles
Code Block
languagejs
themeRDark
{
  "hlsId":"test",
  "profileName":"v_test"
}
Code Block
languagejs
themeRDark
{
  "name": "v_test",
  "stream": {
    "appKey": "defaultApp",
    "sessionId": "test-HLS",
    "mediaSessionId": "81b8b278-612e-4b72-9153-454be9df0a34-test-HLS",
    "name": "test",
    "published": false,
    "hasVideo": false,
    "hasAudio": true,
    "status": "PLAYING",
    "sdp": "...",
    "videoCodec": "H264",
    "record": false,
    "width": 1280,
    "height": 720,
    "bitrate": 0,
    "minBitrate": 0,
    "maxBitrate": 0,
    "quality": 0,
    "parentMediaSessionId": "f3401d2e-7e9a-4e18-a353-d323c947ac94",
    "history": false,
    "gop": 0,
    "fps": 0,
    "audioBitrate": 0,
    "codecImpl": "",
    "transport": "UDP",
    "cvoExtension": true,
    "createDate": 1697605114875,
    "mediaType": "play",
    "audioState": {
      "muted": false
    },
    "videoState": {
      "muted": false
    },
    "mediaProvider": "HLS"
  },
  "keyFrameReceived": true,
  "videoProfile": {
    "type": "video",
    "width": 1280,
    "height": 720,
    "fps": 29,
    "bitrate": 1720,
    "codec": "",
    "quality": 0,
    "audioGroupId": "audio"
  },
  "metrics": {
    "minFPS": 29.962547,
    "avgFPS": 30.000088,
    "maxFPS": 30.04292,
    "countGaps": 0,
    "resolutionChanges": 0,
    "queueSize": 10,
    "startPts": 375400,
    "currentPts": 375400
  },
  "subscribers": 1
}

200 – OK

400 – Bad request

404 – Not found

Получить статистику профиля нарезки HLS
/hls/subscribers
Code Block
languagejs
themeRDark
{
  "hlsId":"test"
}
Code Block
languagejs
themeRDark
[
  {
    "id": "192.168.0.83-59000-Mozilla/5.0 (X11; Linux x86_64) Chrome/118.0.0.0",
    "ip": "192.168.0.83",
    "port": 59000,
    "userAgent": "Mozilla/5.0 (X11; Linux x86_64) Chrome/118.0.0.0",
    "active": true,
    "metrics": {
      "profileTime": {
        "test": 71,
        "v_test": 541353
      },
      "requestsNumber": 5930,
      "requestsStatuses": {
        "200 OK": 5930
      },
      "profileSwitches": 1,
      "maxResponseTime": 29,
      "minResponseTime": 0,
      "avgResponseTime": 0.4436762225969646
    }
  }
]

200 – OK

400 – Bad request

404 – Not found

Получить список подписчиков на HLS нарезку
/hls/enableRecordingconnections
Code Block
languagejs
themeRDark
{
  "idsoffset":0,
  "size":10
}
Code Block
languagejs
themeRDark
[
  {
   "test "ip": "192.168.0.83",
    "test-HLS-ABR-STREAM"
  ]
}port": 51708,
    "userAgent": "Chrome/125.0.0.0 Safari/537.36"
  }
]

200 – OK

400 – Bad request

404 – Not found409 - Conflict

500 - Internal server error

Включить запись сегментов HLS-потока на дискПолучить список HLS клиентов, подключенных к серверу
/hls/disableRecordingenableRecording
Code Block
languagejs
themeRDark
{
  "ids": [
    "test",
    "test-HLS-ABR-STREAM"
  ]
}

200 – OK

400 – Bad request

404 – Not found

Остановить

409 - Conflict

500 - Internal server error

Включить запись сегментов HLS-потока на диск

Параметры

Имя параметра

Описание

Пример

name

Имя потока, опубликованного на сервере

test

/hls/disableRecording
Code Block
languagejs
themeRDark
{
  "ids": [
    "test",
    "test-HLS-ABR-STREAM"
  ]
}

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
languagebash
themeRDark
curl -s http://localhost:8081/?action=stat&params=connections_hls

может отличаться от количества подписчиков. В большинстве случаев, HLS  подписчики используют HTTP 2 протокол, и все вкладки одного браузера, которые получают HLS потоки с одного WCS сервера, будут использовать одно соединение.

При этом количество соединений, отображаемое параметром connections_hls, соответствует количеству установленных соединений на HLS порт, отображаемых командой netstat :

Code Block
languagebash
themeRDark
sudo netstat -np | grep ESTABLISHED | grep java | grep 8445

Здесь 8445 - HTTPS HLS порт WCS сервера

Отображение HLS  клиентов, подключенных к серверу

В сборке 5.2.1968 добавлена возможность выводить список HLS клиентов, подключенных в данный момент к серверу. Этот список возвращается в ответ на запрос /hls/connections :

Code Block
languagejs
themeRDark
[
  {
    "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
languagebash
themeRDark
curl -s 'http://localhostwcs:8081/?action=stat&params=connections_hls

может отличаться от количества подписчиков. В большинстве случаев, HLS  подписчики используют HTTP 2 протокол, и все вкладки одного браузера, которые получают HLS потоки с одного WCS сервера, будут использовать одно соединение.

При этом количество соединений, отображаемое параметром connections_hls, соответствует количеству установленных соединений на HLS порт, отображаемых командой netstat :

Code Block
languagebash
themeRDark
sudo netstat -np | grep ESTABLISHED | grep java | grep 8445

...

params=connections_hls'

Запись сегментов на диск для отладки

...

В сборке 5.2.1920 добавлена настройка, управляющая остановкой HLS провайдера при остановке публикации исходного потока. По умолчанию в этом случае HLS провайдер останавливается с задержкойэтом случае HLS провайдер останавливается с задержкой

Code Block
themeRDark
hls_delayed_shutdown=true

Задержка зависит от размера плейлиста

Code Block
themeRDark
hls_list_size=8

Таким образом, при остановке исходного потока тем подписчикам, которые уже его играют, дается возможность доиграть уже нарезанные сегменты.

При необходимости, задержку можно отключить

Code Block
themeRDark
hls_delayed_shutdown=false

В этом случае HLS провайдер будет остановлен стразу при остановке исходной публикации.

Управление нарезкой HLS  сегментов

По умолчанию сегменты нарезаются либо по получению очередного ключевого кадра, либо по достижении сегментом размера, заданного настройкой (по умолчанию 2000 мс)

Code Block
themeRDark
hls_delayedtime_shutdownmin=true

...

2000

В сборке 5.2.1974 добавлена возможность включить нарезку только по получению ключевых кадров

Code Block
themeRDark
hls_list_size=8

Таким образом, при остановке исходного потока тем подписчикам, которые уже его играют, дается возможность доиграть уже нарезанные сегменты.

...

always_start_segment_with_key_frame=true

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

Code Block
themeRDark
hls_delayed_shutdown=falsekeep_min_segment_duration=true

В этом случае HLS провайдер будет остановлен стразу при остановке исходной публикацииразмер сегмента будет не меньше, чем hls_time_min.

Известные проблемы

1. Невосстанавливаемый фриз HLS потока при воспроизведении в iOS Safari через CDN

...