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 потоком[]

...

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

...

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

В сборке 5.2.19131968 добавлена возможность записать сегменты и плейлисты определенного потока, который уже играют подписчики, на диск в целях отладки. Запись производится в каталог, указанный настройкой

Code Block
themeRDark
hls_debug_dir=hls-debug

Запись сегментов определенного потока запускается при помощи REST API запроса /hls/enableRecording 

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

Code Block
languagejs
themeRDark
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
languagejsbash
themeRDark
POSTcurl /rest-api/hls/disableRecording HTTP/1.1
Host: localhost:8081
Content-Type: application/json
-s 'http://wcs:8081/?action=stat&params=connections_hls'

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

В сборке 5.2.1913 добавлена возможность записать сегменты и плейлисты определенного потока, который уже играют подписчики, на диск в целях отладки. Запись производится в каталог, указанный настройкой

Code Block
themeRDark
hls_debug_dir=hls-debug

Запись сегментов определенного потока запускается при помощи REST API запроса /hls/enableRecording 

Code Block
languagejs
themeRDark
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
languagejs
themeRDark
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 

...

Code Block
themeRDark
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

Согласно спецификации, LL HLS должен воспроизводиться с Начиная со сборки 5.2.1965, для работы LL HLS  по сравнению с настройками по умолчанию достаточно настройки

Code Block
themeRDark
hls_ll_enabled=true

Использование HTTP/2 и HTTP/1

Согласно спецификации, LL HLS должен воспроизводиться с использованием HTTP/2, то есть через безопасное соединение

...

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

Поддержка m4s контейнера

...

Общие настройки для LL и не LL HLS

Начиная со сборки 5.2.1626 добавлена поддержка m4s контейнера для нарезки HLS сегментов, а в сборке 5.2.1632 поддержка данного контейнера включена и для HLS ABR

Code Block
themeRDark
ll_hls_fragmented_mp4=true

Начиная со сборки 5.1965, все настройки с префиксом hls_ применяются одинаково к LL и не LL HLS.

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
themeRDark
ll_hls_fragmented_mp4=true

Начиная со сборки 5.2.1724, контейнер m4s поддерживается и для HLS ABR в CDN.

...

Code Block
themeRDark
https://wcs:8445/stream-HLS-ABR-STREAM/stream-HLS-ABR-ABR-STREAM.m3u8

...

STREAM.m3u8

Если необходимо, например, задать фиксированное имя манифеста и при этом различать ABR и не ABR потоки, можно задать следующие шаблоны

Code Block
themeRDark
hls_path_template={streamName}/playlist.m3u8
hls_abr_path_template={streamName}/playlist{abrSuffix}.m3u8

В этом случае для получения манифеста HLS потока будет использоваться URL

Code Block
themeRDark
https://wcs:8445/stream/playlist.m3u8

а для HLS ABR потока

Code Block
themeRDark
https://wcs:8445/stream/playlist-HLS-ABR-STREAM.m3u8

Остановка HLS провайдера при остановке публикации

В сборке 5.2.1920 добавлена настройка, управляющая остановкой 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_time_min=2000

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

Code Block
themeRDark
hls_always_start_segment_with_key_frame=true

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

Code Block
themeRDark
hls_path_template={streamName}/playlist.m3u8
hls_abr_path_template={streamName}/playlist{abrSuffix}.m3u8keep_min_segment_duration=true

В этом случае для получения манифеста HLS потока будет использоваться URL

Code Block
themeRDark
https://wcs:8445/stream/playlist.m3u8

а для HLS ABR потока

...

themeRDark

...

размер сегмента будет не меньше, чем hls_time_min.

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

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

...