Versions Compared

Key

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

...

При необходимости, любой из потоков, опубликованных на сервере по WebRTC, RTMP, MPEG-TS, или захваченный из RTSP или RTMP  RTMP источника по REST API, может автоматически нарезаться на HLS сегменты. Эта возможность включается настройкой

Code Block
themeRDark
hls_auto_start=true

В сборке 5.2.1895 добавлена возможность автоматической нарезки HLS ABR, при условии, что используется HLS ABR на одном узле. Эта возможность включается настройкой

Code Block
themeRDark
hls_abr_auto_start=true

Аутентификация воспроизведения HLS с помощью REST hook

...

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

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

Preloader для воспроизведения потока по HLS

При подключении первого HLS-подписчика к потоку, в особенности к потоку из CDN, необходимо определенное время, чтобы началась нарезка потока на HLS-сегменты, и был сформирован плейлист. В результате, браузер Safari на устройствах iOS может не подключиться к потоку по HLS с первой попытки. Чтобы подключение всегда проходило успешно, в сборке 5.2.371 добавлено воспроизведение прелоадера. Прелоадер по умолчанию выглядит следующим образом

Image Removed

В сборке 5.2.408 прелоадеры разделены по соотношениям сторон картинки потока: 16:9, 4:3, 2:1

...

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
tree /usr/local/FlashphonerWebCallServer/hls/.preloader
/usr/local/FlashphonerWebCallServer/hls/.preloader
├── 16x9
│   ├── index0.ts
│   ├── index10.ts
│   ├── index11.ts
│   ├── index12.ts
│   ├── index13.ts
│   ├── index14.ts
│   ├── index15.ts
│   ├── index16.ts
│   ├── index17.ts
│   ├── index18.ts
│   ├── index19hls_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.

Preloader для воспроизведения потока по HLS

При подключении первого HLS-подписчика к потоку, в особенности к потоку из CDN, необходимо определенное время, чтобы началась нарезка потока на HLS-сегменты, и был сформирован плейлист. В результате, браузер Safari на устройствах iOS может не подключиться к потоку по HLS с первой попытки. Чтобы подключение всегда проходило успешно, в сборке 5.2.371 добавлено воспроизведение прелоадера. Прелоадер по умолчанию выглядит следующим образом

Image Added

В сборке 5.2.408 прелоадеры разделены по соотношениям сторон картинки потока: 16:9, 4:3, 2:1

Сегменты прелоадера по умолчанию записываются в каталог /usr/local/FlashphonerWebCallserver/hls/.preloader при запуске сервера

Code Block
themeRDark
tree /usr/local/FlashphonerWebCallServer/hls/.preloader
/usr/local/FlashphonerWebCallServer/hls/.preloader
├── 16x9
│   ├── index0.ts
│   ├── index1index10.ts
│   ├── index2index11.ts
│   ├── index3index12.ts
│   ├── index4index13.ts
│   ├── index5index14.ts
│   ├── index6index15.ts
│   ├── index7index16.ts
│   ├── index8index17.ts
│   └──├── index9index18.ts
├── 2x1
│   ├── index0index19.ts
│   ├── index10index1.ts
│   ├── index11index2.ts
│   ├── index12index3.ts
│   ├── index13index4.ts
│   ├── index14index5.ts
│   ├── index15index6.ts
│   ├── index16index7.ts
│   ├── index17index8.ts
│   ├──└── index18index9.ts
├── 2x1
│   ├── index19index0.ts
│   ├── index1index10.ts
│   ├── index2index11.ts
│   ├── index3index12.ts
│   ├── index13.ts
│   ├── index14.ts
│   ├── index15.ts
│   ├── index16.ts
│   ├── index17.ts
│   ├── index18.ts
│   ├── index19.ts
│   ├── index1.ts
│   ├── index2.ts
│   ├── index3.ts
│   ├── index4.ts
│   ├── index5.ts
│   ├── index6.ts
│   ├── index7.ts
│   ├── index8.ts
│   └── index9.ts
└── 4x3
    ├── index0.ts
    ├── index10.ts
    ├── index11.ts
    ├── index12.ts
    ├── index13.ts
    ├── index14.ts
    ├── index15.ts
    ├── index16.ts
    ├── index17.ts
    ├── index18.ts
    ├── index19.ts
    ├── index1.ts
    ├── index2.ts
    ├── index3.ts
    ├── index4.ts
    ├── index5.ts
    ├── index6.ts
    ├── index7.ts
    ├── index8.ts
    └── index9.ts

...

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 нарезку

Параметры

...

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

...

Описание

...

Пример

...

name

...

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

...

test

...

Особенности

1. Если HLS нарезка потока запущена при помощи REST запроса /hls/startup, и нет активных HLS подписчиков, нарезка остановится по истечении интервала в секундах

Code Block
themeRDark
hls_manager_provider_timeout=300

По умолчанию, интервал составляет 5 минут. То же касается автоматически созданных HLS нарезок при установленной настройке

Code Block
themeRDark
hls_auto_start=true

2. Если HLS нарезка потока останавливается при помощи REST запроса /hls/terminate, и есть активные HLS подписчики, то нарезка будет перезапущена. При этом активные HLS подписчики должны повторно подключиться к потоку.

Отображение сообщений о проблемах с LL HLS потоком

В сборке 5.2.1709 добавлена возможность вывода сообщений о проблемах с LL HLS потоком в ответ на REST API запрос /hls/find_all:

...

/hls/connections
Code Block
languagejs
themeRDark
{
  "offset":0,
  "size":10
}
Code Block
languagejs
themeRDark
[
  {
    "ip": "192.168.0.83",
    "port": 51708,
    "userAgent": "Chrome/125.0.0.0 Safari/537.36"
  }
]

200 – OK

400 – Bad request

404 – Not found

500 - Internal server error

Получить список HLS клиентов, подключенных к серверу
/hls/enableRecording
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-потока на диск
/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 потоком[]

Особенности

1. Если HLS нарезка потока запущена при помощи REST запроса /hls/startup, и нет активных HLS подписчиков, нарезка остановится по истечении интервала в секундах

Code Block
themeRDark
hls_metricsmanager_logprovider_sizetimeout=50

Диагностируются следующие проблемы:

  • Fps changed from x to y - скачок FPS потока более 10 %
  • Segment x does not start with keyframe - интервал между ключевыми кадрами потока превышает длительность одного сегмента
  • Playback speed changed to x - скорость проигрывания потока изменилась
  • Segment interval is too big - слишком большой интервал между сегментами
  • Video resolution changed from x to y - разрешение потока изменилось
  • Gap{from=x, to=y, duration=z} - пауза в потоке, в плейлист вставлен тэг EXT-X-GAP 

Любая из этих проблем означает ухудшение качества исходной публикации, которая проигрывается по HLS, и может приводить к фризам, рассинхронизации звука и видео и остановке проигрывания в некоторых браузерах. В таких случаях следует принять меры по снижению помех на канале публикации, либо изменить способ публикации, например, с WebRTC на RTMP или SRT как более помехоустойчивые.

...

300

По умолчанию, интервал составляет 5 минут. То же касается автоматически созданных HLS нарезок при установленной настройке

Code Block
themeRDark
hls_auto_start=true

2. Если HLS нарезка потока останавливается при помощи REST запроса /hls/terminate, и есть активные HLS подписчики, то нарезка будет перезапущена. При этом активные HLS подписчики должны повторно подключиться к потоку.

Отображение сообщений о проблемах с LL HLS потоком

В сборке 5.2.17771709 добавлена возможность получения статистики HLS  потока при помощи REST API

Данные о потоке в целом

В ответ на вывода сообщений о проблемах с LL HLS потоком в ответ на REST API запрос /hls/find_all возвращается список всех HLS потоков на сервере с основной информацией о них:

Code Block
languagejs
themeRDark
[{
    "idtest": "test",{
    "streamNamehandler": "testcom.flashphoner.server.client.handler.wcs4.WCS4Handler@74dbf27b",
    "statusstate": "ACTIVE",
    "waitingSizewriter": 0"HLS-test",
    "profilesstreamStatus": ["PLAYING",
    "writerStarted": "true",
    "a_test",logs": [
      "v_test"
    ],
    "subscribers": 1,
    "playlist": "#EXTM3U\n#EXT-X-VERSION:9\n#EXT-X-INDEPENDENT-SEGMENTS\n#EXT-X-MEDIA:TYPE=AUDIO,URI=\"a_test/a_test.m3u8\",GROUP-ID=\"audio\",NAME=\"none\",DEFAULT=YES,AUTOSELECT=YES,CHANNELS=\"2\"\n#EXT-X-STREAM-INF:BANDWIDTH=1761281,CODECS=\"avc1.640028,mp4a.40.2\",RESOLUTION=1280x720,FRAME-RATE=29.0,AUDIO=\"audio\"\nv_test/v_test.m3u8\n",
    "createdDate": 1697605114475,
    "logs": []
}]

Здесь

  • id - идентификатор HLS потока
  • streamName - имя исходного потока, который нарезается на HLS сегменты
  • waitingSize - количество HTTP запросов, ожидающих ответа
  • profiles - список аудио и видео профилей
  • subscribers -  число HLS подписчиков
  • playlist - содержимое HLS манифеста
  • createdDate - дата создания в виде целого числа
  • logs - список сообщений о проблемах с HLS потоком

При большом количестве потоков на сервере выдачу запроса можно ограничивать параметрами

Code Block
languagejs
themeRDark
{
  "offset":0,
  "size":10
}

Здесь

  • offset - с какого элемента выводить список, по умолчанию 0
  • size - максимальное количество выводимых элементов, по умолчанию 10

Данные об аудио и видео профилях нарезки

...

2023-07-18T10:22:52.457 WARNING: Playback speed changed to 0.779, segment 49, media type: video",
      "2023-07-18T10:22:56.614 WARNING: Gap{from=112000, to=114000, duration=2000}, media type: video",
      "2023-07-18T10:22:56.615 WARNING: Fps changed from 30 to 27, segment 50 , media type: video",
      "2023-07-18T10:22:56.624 WARNING: Segment 51.1 have no data, pts 112400, duration 400, media type: video",
      ...
    ]
  }
}

По умолчанию, для каждого потока выводится до 50 последних сообщений. Это значение может быть изменено при помощи настройки

Code Block
themeRDark
hls_metrics_log_size=50

Диагностируются следующие проблемы:

  • Fps changed from x to y - скачок FPS потока более 10 %
  • Segment x does not start with keyframe - интервал между ключевыми кадрами потока превышает длительность одного сегмента
  • Playback speed changed to x - скорость проигрывания потока изменилась
  • Segment interval is too big - слишком большой интервал между сегментами
  • Video resolution changed from x to y - разрешение потока изменилось
  • Gap{from=x, to=y, duration=z} - пауза в потоке, в плейлист вставлен тэг EXT-X-GAP 

Любая из этих проблем означает ухудшение качества исходной публикации, которая проигрывается по HLS, и может приводить к фризам, рассинхронизации звука и видео и остановке проигрывания в некоторых браузерах. В таких случаях следует принять меры по снижению помех на канале публикации, либо изменить способ публикации, например, с WebRTC на RTMP или SRT как более помехоустойчивые.

Отображение статистики HLS потока

В сборке 5.2.1777 добавлена возможность получения статистики HLS  потока при помощи REST API

Данные о потоке в целом

В ответ на запрос /hls/find_all возвращается список всех HLS потоков на сервере с основной информацией о них:

Code Block
languagejs
themeRDark
[{
    "nameid": "v_test",
    "streamstreamName": {"test",
    "appKeystatus": "defaultAppACTIVE",
    "sessionIdwaitingSize": "test-HLS"0,
    "mediaSessionIdprofiles": "81b8b278-612e-4b72-9153-454be9df0a34-test-HLS",
[
     "name": "a_test",
      "published": false,v_test"
    "hasVideo": false],
    "hasAudiosubscribers": true1,
    "statusplaylist": "PLAYING",
    "sdp": "v=0\r\no=- 1988962254 1988962254 IN IP4 0.0.0.0\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=sdplang:en\r\nm=video 0 RTP/AVP 112\r\na=rtpmap:112 H264/90000\r\na=fmtp:112 packetization-mode=1; profile-level-id=42001f\r\na=recvonly\r#EXTM3U\n#EXT-X-VERSION:9\n#EXT-X-INDEPENDENT-SEGMENTS\n#EXT-X-MEDIA:TYPE=AUDIO,URI=\"a_test/a_test.m3u8\",GROUP-ID=\"audio\",NAME=\"none\",DEFAULT=YES,AUTOSELECT=YES,CHANNELS=\"2\"\n#EXT-X-STREAM-INF:BANDWIDTH=1761281,CODECS=\"avc1.640028,mp4a.40.2\",RESOLUTION=1280x720,FRAME-RATE=29.0,AUDIO=\"audio\"\nv_test/v_test.m3u8\n",
    "videoCodeccreatedDate": "H264"1697605114475,
    "recordlogs": false,
    "width": 1280,
    "height": 720,
    "bitrate": 0,
    "minBitrate": 0,
    "maxBitrate": 0,
    "quality": 0,
    "parentMediaSessionId": "f3401d2e-7e9a-4e18-a353-d323c947ac94",
    "history": false,[]
}]

Здесь

  • id - идентификатор HLS потока
  • streamName - имя исходного потока, который нарезается на HLS сегменты
  • waitingSize - количество HTTP запросов, ожидающих ответа
  • profiles - список аудио и видео профилей
  • subscribers -  число HLS подписчиков
  • playlist - содержимое HLS манифеста
  • createdDate - дата создания в виде целого числа
  • logs - список сообщений о проблемах с HLS потоком

При большом количестве потоков на сервере выдачу запроса можно ограничивать параметрами

Code Block
languagejs
themeRDark
{
  "offset":0,
  "size":10
}

Здесь

  • offset - с какого элемента выводить список, по умолчанию 0
  • size - максимальное количество выводимых элементов, по умолчанию 10

Данные об аудио и видео профилях нарезки

В ответ на запрос /hls/profiles возвращается статистика аудио или видео профиля нарезки:

Code Block
languagejs
themeRDark
{
  "name": "v_test",
  "stream": {
    "gopappKey": 0"defaultApp",
    "fpssessionId": 0"test-HLS",
    "audioBitratemediaSessionId": 0"81b8b278-612e-4b72-9153-454be9df0a34-test-HLS",
    "codecImplname": "test",
    "transportpublished": "UDP"false,
    "cvoExtensionhasVideo": truefalse,
    "createDatehasAudio": 1697605114875true,
    "mediaTypestatus": "playPLAYING",
    "audioStatesdp": {
      "muted": false
    }"v=0\r\no=- 1988962254 1988962254 IN IP4 0.0.0.0\r\nc=IN IP4 0.0.0.0\r\nt=0 0\r\na=sdplang:en\r\nm=video 0 RTP/AVP 112\r\na=rtpmap:112 H264/90000\r\na=fmtp:112 packetization-mode=1; profile-level-id=42001f\r\na=recvonly\r\n",
    "videoStatevideoCodec": {
  "H264",
    "mutedrecord": false,
    "width": }1280,
    "mediaProviderheight": "HLS"720,
  },
  "keyFrameReceivedbitrate": true0,
    "videoProfileminBitrate": {0,
    "typemaxBitrate": "video"0,
    "widthquality": 12800,
    "heightparentMediaSessionId": 720"f3401d2e-7e9a-4e18-a353-d323c947ac94",
    "fpshistory": 29false,
    "bitrategop": 17200,
    "codecfps": ""0,
    "qualityaudioBitrate": 0,
    "audioGroupIdcodecImpl": "audio",
  },
  "metricstransport": {"UDP",
    "minFPScvoExtension": 29.962547true,
    "avgFPScreateDate": 30.0000881697605114875,
    "maxFPSmediaType": 30.04292"play",
    "countGapsaudioState": 0,{
      "resolutionChangesmuted": 0false
    },
    "queueSizevideoState": 10,{
      "startPtsmuted": 375400 false
    },
    "currentPtsmediaProvider": 375400"HLS"
  },
  "subscriberskeyFrameReceived": 1
}

Здесь:

  • name - имя профиля
  • stream - информация о потоке профиля, состав полей аналогичен ответу на запрос /stream/find 
  • keyFrameReceived - получен ли хотя бы один ключевой кадр из исходного потока
  • audioProfile, videoProfile - исходные данные аудио или видео профиля
    • type - тип: видео или аудио
    • width - заданная ширина картинки видео
    • height - заданная высота картинки видео
    • fps - частота кадров видео
    • bitrate - заданный битрейт профиля
    • codec - заданный кодек профиля
    • quality - заданное качество видео профиля
    • audioGroupId - идентификатор аудио профиля, заданный в видео профиле
    • rate - частота дискретизации аудио профиля
    • channels - количество каналов аудио профиля
    • groupId - идентификатор аудио профиля для привязки видео
  • metrics - текущие метрики профиля:
    • minFPS - минимальный FPS
    • avgFPS -  средний FPS
    • maxFPS - максимальный FPS
    • countGaps - количество пауз, вставленных в поток
    • resolutionChanges - изменения разрешения видео
    • queueSize - размер очереди кадров потока
    • startPts - стартовая метка времени MPEG
    • currentPts - текущая метка времени MPEG
  • subscribers - количество HLS подписчиков на данный профиль

Данные о подписчиках на HLS поток

В ответ на запрос /hls/subscribers возвращается статистика подписчиков на HLS поток:

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"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,
    "portqueueSize": 5900010,
    "userAgentstartPts": "Mozilla/5.0 (X11; Linux x86_64) Chrome/118.0.0.0"375400,
    "activecurrentPts": true,375400
    "metrics": {
    },
  "profileTimesubscribers": {
        "test": 71,
        "v_test": 541353
      },
      "requestsNumber": 5930,
      "requestsStatuses": {
        "200 OK": 5930
      },
      "profileSwitches": 1,
      "maxResponseTime": 29,1
}

Здесь:

  • name - имя профиля
  • stream - информация о потоке профиля, состав полей аналогичен ответу на запрос /stream/find 
  • keyFrameReceived - получен ли хотя бы один ключевой кадр из исходного потока
  • audioProfile, videoProfile - исходные данные аудио или видео профиля
    • type - тип: видео или аудио
    • width - заданная ширина картинки видео
    • height - заданная высота картинки видео
    • fps - частота кадров видео
    • bitrate - заданный битрейт профиля
    • codec - заданный кодек профиля
    • quality - заданное качество видео профиля
    • audioGroupId - идентификатор аудио профиля, заданный в видео профиле
    • rate - частота дискретизации аудио профиля
    • channels - количество каналов аудио профиля
    • groupId - идентификатор аудио профиля для привязки видео
  • metrics - текущие метрики профиля:
    • minFPS - минимальный FPS
    • avgFPS -  средний FPS
    • maxFPS - максимальный FPS
    • countGaps - количество пауз, вставленных в поток
    • resolutionChanges - изменения разрешения видео
    • queueSize - размер очереди кадров потока
    • startPts - стартовая метка времени MPEG
    • currentPts - текущая метка времени MPEG
  • subscribers - количество HLS подписчиков на данный профиль

Данные о подписчиках на HLS поток

В ответ на запрос /hls/subscribers возвращается статистика подписчиков на HLS поток:

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": {
      "minResponseTimeprofileTime": 0,{
        "avgResponseTimetest": 0.4436762225969646
71,
      }
  }
]

Здесь:

...

"v_test": 541353
      },
      "requestsNumber": 5930,
      "requestsStatuses": {
        "200 OK": 5930
      },
      "profileSwitches": 1,
      "maxResponseTime": 29,
      "minResponseTime": 0,
      "avgResponseTime": 0.4436762225969646
    }
  }
]

Здесь:

  • id - идентификатор подписчика
  • ip - IP адрес подписчика
  • port -  исходящий порт подписчика
  • userAgent - данные заголовка User-Agent, переданные подписчиком
  • active - подписчик активен
  • metrics - текущие метрики подписчика:
    • profileTime - время, в течение которого подписчик запрашивал данный профиль, указанное для каждого профиля
    • requestsNumber - количество запросов от подписчика
    • requestStatuses - количество статусов ответов на запросы подписчика, указанное для каждого запроса
    • profileSwitches - число переходов подписчика с одного HLS ABR профиля на другой
    • maxResponseTime - максимальное время ответа на запрос
    • minResponseTime - минимальное время ответа на запрос
    • avgResponseTime - среднее время ответа на запроc

...

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

Поддержка HLS ABR

Для потоков с видео (только видео или видео+аудио) WCS поддерживает HLS ABR в CDN (в этом случае качества кодируются на выделенном Transcoder сервере) и на одном узле.

Warning

Для потоков только с аудио HLS ABR не работает, при попытке запросить HLS ABR  манифест для такого потока сервер вернет 404 Not found !

Устаревшая реализация в сборках 5.2.484 - 5.2.582

В сборке 5.2.484 добавлена поддержка HLS ABR плейлистов. Использование этой возможности включается при помощи настройки

Code Block
themeRDark
hls_master_playlist_enabled=true

Имя основного плейлиста указывается при помощи настройки

Code Block
themeRDark
hls_manifest_file=index.m3u8

Браузер должен запросить основной плейлист по URL

Code Block
themeRDark
https://wcs_address:8445/streamName/index.m3u8

Здесь

  • wcs_address - адрес WCS сервера
  • streamName - имя потока на сервере
  • index.m3u8 - имя основного плейлиста

При запросе основного плейлиста сервер проверяет наличие потоков, транскодируемых из указанного потока согласно профилям транскодинга, перечисленным в файле настроек cdn_profiles.yml, например:

Code Block
themeRDark
profiles:
  -720p:
    video:
      height: 720
      bitrate: 1000
      codec: h264
  -480p:
    video:
      height: 480
      bitrate: 1000
      codec: h264
  -240p:
    video:
      height: 240
      bitrate: 400
      codec: h264

Все транскодированные потоки по профилям, которые в момент запроса опубликованы на сервере, попадают в основной плейлист, например:

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
../streamName-720p/streamName-720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=852x480,CODECS="avc1.42e01f,mp4a.40.2"
../streamName-480p/streamName-480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=426x240,CODECS="avc1.42e01f,mp4a.40.2"
../streamName-240p/streamName-240p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
../streamName/streamName.m3u8

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

Warning

В момент, когда браузер запрашивает основной плейлист, потоки уже должны быть опубликованы на сервере и нарезаться на HLS сегменты

Чтобы обеспечить наличие потоков, необходимо:

1. На отдельно стоящем сервере:

1.1. Периодически проверять, транскодируются ли потоки к указанным  параметрам, и запускать транскодинг при необходимости при помощи REST API

Code Block
languagebash
themeRDark
	curl -s -X POST -d "{\"uri\":\"transcoder://tcode_test-240p\",\"remoteStreamName\":\"test\",\"localStreamName\":\"test-240p\",\"encoder\":{\"width\":320,\"height\":240}}" http://localhost:8081/rest-api/transcoder/startup
	curl -s -X POST -d "{\"uri\":\"transcoder://tcode_test-480p\",\"remoteStreamName\":\"test\",\"localStreamName\":\"test-480p\",\"encoder\":{\"width\":640,\"height\":480}}" http://localhost:8081/rest-api/transcoder/startup
	curl -s -X POST -d "{\"uri\":\"transcoder://tcode_test-720p\",\"remoteStreamName\":\"test\",\"localStreamName\":\"test-720p\",\"encoder\":{\"width\":1280,\"height\":720}}" http://localhost:8081/rest-api/transcoder/startup

...

Отображение 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://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
https://wcs:8445/test-DEBUG/test-DEBUG.m3u8

Если поток с определенным именем был записан, а затем опубликован новый поток с таким же именем, запись нового потока будет сделана с удалением предыдущей.

Поддержка HLS ABR

Для потоков с видео (только видео или видео+аудио) WCS поддерживает HLS ABR в CDN (в этом случае качества кодируются на выделенном Transcoder сервере) и на одном узле.

Warning

Для потоков только с аудио HLS ABR не работает, при попытке запросить HLS ABR  манифест для такого потока сервер вернет 404 Not found !

Устаревшая реализация в сборках 5.2.484 - 5.2.582

В сборке 5.2.484 добавлена поддержка HLS ABR плейлистов. Использование этой возможности включается при помощи настройки

Code Block
themeRDark
hls_master_playlist_enabled=true

Имя основного плейлиста указывается при помощи настройки

Code Block
themeRDark
hls_manifest_file=index.m3u8

Браузер должен запросить основной плейлист по URL

Code Block
themeRDark
https://wcs_address:8445/streamName/index.m3u8

Здесь

  • wcs_address - адрес WCS сервера
  • streamName - имя потока на сервере
  • index.m3u8 - имя основного плейлиста

При запросе основного плейлиста сервер проверяет наличие потоков, транскодируемых из указанного потока согласно профилям транскодинга, перечисленным в файле настроек cdn_profiles.yml, например:

Code Block
themeRDark
profiles:
  -720p:
    video:
      height: 720
      bitrate: 1000
      codec: h264
  -480p:
    video:
      height: 480
      bitrate: 1000
      codec: h264
  -240p:
    video:
      height: 240
      bitrate: 400
      codec: h264

Все транскодированные потоки по профилям, которые в момент запроса опубликованы на сервере, попадают в основной плейлист, например:

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
../streamName-720p/streamName-720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=852x480,CODECS="avc1.42e01f,mp4a.40.2"
../streamName-480p/streamName-480p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=400000,RESOLUTION=426x240,CODECS="avc1.42e01f,mp4a.40.2"
../streamName-240p/streamName-240p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,CODECS="avc1.42e01f,mp4a.40.2"
../streamName/streamName.m3u8

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

Warning

В момент, когда браузер запрашивает основной плейлист, потоки уже должны быть опубликованы на сервере и нарезаться на HLS сегменты

Чтобы обеспечить наличие потоков, необходимо:

1. На отдельно стоящем сервере:

1.1. Периодически проверять, транскодируются ли потоки к указанным  параметрам, и запускать транскодинг при необходимости при помощи REST API

Code Block
languagebash
themeRDark
	curl -s -X POST -d "{\"nameuri\":\"transcoder://tcode_test-240p\"}" ,\"remoteStreamName\":\"test\",\"localStreamName\":\"test-240p\",\"encoder\":{\"width\":320,\"height\":240}}" http://localhost:8081/rest-api/hlstranscoder/startup
sleep 1
	curl -s -X POST -d "{\"name\"uri\":\"transcoder://tcode_test-480p\",\"remoteStreamName\":\"test\",\"localStreamName\":\"test-240p\"480p\",\"encoder\":{\"width\":640,\"height\":480}}" http://localhost:8081/rest-api/hlstranscoder/startup
sleep 1
	curl -s -X POST -d "{\"nameuri\":\"transcoder://tcode_test-480p720p\"}" http://localhost:8081/rest-api/hls/startup
sleep 1
curl -s -X POST -d "{\"name\":\"test-720p\"},\"remoteStreamName\":\"test\",\"localStreamName\":\"test-720p\",\"encoder\":{\"width\":1280,\"height\":720}}" http://localhost:8081/rest-api/hlstranscoder/startup

1.2. На Edge сервере в CDN периодически запрашивать HLS потоки по профилямПериодически запускать HLS потоки для включения в основной плейлист, например

Code Block
languagebash
themeRDark
curl -s -X POST -d "{\"name\":\"test\"}" http://localhost:8082/test/test.m3u88081/rest-api/hls/startup
sleep 1
curl -s http://localhost:8082/test-240p/test-240p.m3u8 -X POST -d "{\"name\":\"test-240p\"}" http://localhost:8081/rest-api/hls/startup
sleep 1
curl -s -X POST -d "{\"name\":\"test-480p\"}" http://localhost:80828081/testrest-480p/test-480p.m3u8api/hls/startup
sleep 1
curl -s -X POST -d "{\"name\":\"test-720p\"}" http://localhost:80828081/testrest-720p/test-720p.m3u8
sleep 1

Актуальная реализация в сборках 5.2.585 и новее

В сборке 5.2.585 реализация HLS ABR существенно изменена. Как и прежде, HLS ABR может использоваться только в CDN, при этом все транскодированные потоки для вариантов в ABR манифесте Edge забирает одновременно в пределах одной медиасессии, чтобы варианты одного потока были синхронизированы друг с другом. Это требует совместной настройки Transcoder и Edge узлов и накладывает ряд ограничений. Рассмотрим их ниже.

Настройки Transcoder узлов

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

Code Block
themeRDark
transcoder_align_encoders=true

Кроме того, должен быть включен FPS фильтр

Code Block
themeRDark
video_filter_enable_fps=true
video_filter_fps=25

Ключевые фреймы в вариантах потока должны быть синхронизированы. Например, при 25 кадрах в секунду будем отправлять ключевой фрейм каждые 2 секунды

Code Block
themeRDark
video_filter_fps_gop_synchronization=50

Настройки HLS Edge узлов

...

api/hls/startup

2. На Edge сервере в CDN периодически запрашивать HLS потоки по профилям, например

Code Block
languagebash
themeRDark
curl -s http://localhost:8082/test/test.m3u8
sleep 1
curl -s http://localhost:8082/test-240p/test-240p.m3u8
sleep 1
curl -s http://localhost:8082/test-480p/test-480p.m3u8
sleep 1
curl -s http://localhost:8082/test-720p/test-720p.m3u8
sleep 1

Актуальная реализация в сборках 5.2.585 и новее

В сборке 5.2.585 реализация HLS ABR существенно изменена. Как и прежде, HLS ABR может использоваться только в CDN, при этом все транскодированные потоки для вариантов в ABR манифесте Edge забирает одновременно в пределах одной медиасессии, чтобы варианты одного потока были синхронизированы друг с другом. Это требует совместной настройки Transcoder и Edge узлов и накладывает ряд ограничений. Рассмотрим их ниже.

Настройки Transcoder узлов

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

Code Block
themeRDark
hlstranscoder_preloaderalign_enabled=false
encoders=true

Кроме того, должен быть включен FPS фильтр

Code Block
themeRDark
video_filter_enable_fps=true
video_filter_fps=25

Ключевые фреймы в вариантах потока должны быть синхронизированы. Например, при 25 кадрах в секунду будем отправлять ключевой фрейм каждые 2 секунды

Code Block
themeRDark
video_filter_fps_gop_synchronization=50

Настройки HLS Edge узлов

На HLS Edge узлах необходимо отключить использование прелоадера и транскодирование потоков

Code Block
themeRDark
hls_preloader_enabled=false
hls_player_width=0
hls_player_height=0

...

Code Block
languageyml
themeRDark
profiles:
  360:
    video:
      height : 360
      bitrate : 1000
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

  720:
    video:
      height : 720
      bitrate : 2000
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

  1080:
    video:
      height : 1080
      bitrate : 2500
      codec : h264
      codecImpl : OPENH264
      gop : 60
      fps : 30

манифест будет такимбудет таким

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080,CODECS="avc1.42e01f,mp4a.40.2"
1080/1080.m3u8
#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

Начиная со сборки 5.2.1606, порядок следования качеств в манифесте соответствует порядку перечисления профилей в cdn_profiles.yml  или hls_abr_profiles.yml

Code Block
themeRDark
#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-фреймов в исходном потоке

Для того, чтобы снизить нагрузку на сервер при кодировании видео, в сборке 5.2.1840 добавлена возможность транскодировать максимальное ABR качество (которое обычно соответствует оригинальному разрешению потока) только при наличии B-фреймов в потоке. Эта возможность включается настройкой

Code Block
themeRDark
h264_b_frames_force_transcoding=true

При этом сервер проверяет наличие B-фреймов в исходном потоке, анализируя заданное количество фреймов (по умолчанию 10)

Code Block
themeRDark
frame_cnt_to_determine_their_type=10

Если в потоке есть B-фреймы, максимальное ABR качество будет транскодироваться, и будет доступно плееру в HLS манифесте

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

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

Начиная со сборки 5.2.1916, эта возможность доступна и для HLS ABR в CDN. Для этого все серверы в CDN  должны быть обновлены до сборки 5.2.1916 или новее, и на Edge сервере указаны следующие настройки

Code Block
themeRDark
cdn_strict_transcoding_boundaries=true
h264_b_frames_force_transcoding=true

Максимальный размер плейлиста

Максимальный размер плейлиста в сегментах задается настройкой

Code Block
themeRDark
hls_list_size=8

По умолчанию размер HLS плейлиста равен 8 сегментам. Отметим, что, когда нарезка HLS только стартовала, количество сегментов в первых плейлистах будет меньше заданного.

Хранение сегментов HLS

Использование диска

 В сборках до 5.2.1713 HLS-сегменты по умолчанию записываются на диск сервера, в каталог /usr/local/FlashphonerWebCallServer/hls . Начиная со сборки 5.2.687, каталог для сохранения сегментов можно изменить при помощи параметра

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1920x1080,CODECS="avc1.42e01f,mp4a.40.2"
1080/1080.m3u8
#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

...

hls_dir=/usr/local/FlashphonerWebCallServer/hls

(Расположение прелоадера настраивается отдельно при помощи параметра hls_preloader_dir .)

На диске хранится количество сегментов, соответствующее заданному размеру плейлиста. Чем меньше количество сегментов в плейлисте, тем меньше задержка при воспроизведении. Однако при коротком плейлисте подписчики с недостаточной пропускной способностью каналов могут запрашивать сегменты, которых уже нет в плейлисте и на диске. В связи с этим, в сборке 5.2.581 добавлена возможность хранить некоторое число сегментов на диске после их ухода из плейлиста. Эта возможность включается настройкой

Code Block
themeRDark
hls_hold_segments_before_delete=true

По умолчанию, будет храниться 5 последних сегментов

Code Block
themeRDark
hls_hold_segments_size=5

Например, если плейлист содержит 3 сегмента

Code Block
themeRDark
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1000000,RESOLUTION=640x360,CODECS="avc1.42e01f,mp4a.40.2"
360/360.m3u8VERSION:8
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:15
#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-фреймов в исходном потоке

...

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

При этом сервер проверяет наличие B-фреймов в исходном потоке, анализируя заданное количество фреймов (по умолчанию 10)

Code Block
themeRDark
frame_cnt_to_determine_their_type=10

Если в потоке есть B-фреймы, максимальное ABR качество будет транскодироваться, и будет доступно плееру в HLS манифесте

Code Block
themeRDark
#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 качество не будет транскодироватьсяДля отправки подписчикам сегменты будут считываться из памяти. Необходимо отметить, что в этом случае потребуется больше памяти под Java heap для хранения сегментов.

В сборке 5.2.1713 хранение сегментов в оперативной памяти включено по умолчанию.

Отладочные логи для HLS-сессии

Для отчета об ошибке можно, используя CLI, включить сбор отладочных логов для HLS-сессий

Code Block
languagebash
themeRDark
update node-setting --value true hls_enable_session_debug

Следует учесть, что файл настроек flashphoner.properties будет перезаписан после этой команды.

Поддержка Low Latency HLS

Начиная со сборки 5.2.1181, поддерживается Low Latency HLS (LL HLS). Эта возможность включается при помощи настройки

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

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

Warning

В настоящее время эта возможность поддерживается только для HLS ABR и WebRTC ABR на одном узле

Максимальный размер плейлиста

...

hls_ll_enabled=true
hls_new_http_stack=true

В этом случае плееры, которые поддерживают 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
themeRDark
hls_list_size=8

По умолчанию размер HLS плейлиста равен 8 сегментам. Отметим, что, когда нарезка HLS только стартовала, количество сегментов в первых плейлистах будет меньше заданного.

Хранение сегментов 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

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

Code Block
themeRDark
hls_dir=/usr/local/FlashphonerWebCallServer/hls

(Расположение прелоадера настраивается отдельно при помощи параметра hls_preloader_dir .)

...

ll_enabled=true

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

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

Code Block
themeRDark
https://wsc:8445/test/test.m3u8

В WCS также возможно использование HTTP/1 через небезопасное соединение

Code Block
themeRDark
http://wsc:8082/test/test.m3u8

Отметим, что LL HLS через HTTP/1 работает во всех основных браузерах, кроме Safari, поэтому не рекомендуется использовать эту возможность в промышленной эксплуатации.

Каталог для нарезки сегментов LL HLS

По умолчанию, сегменты LL HLS помещаются в подкаталоги с именами потоков в каталог

Code Block
themeRDark
hls_hold_segments_before_delete=true

...

ll_hls_dir=/usr/local/FlashphonerWebCallServer/ll-hls

При изменении местоположения, например

Code Block
themeRDark
ll_hls_hold_segments_size=5

Например, если плейлист содержит 3 сегмента

code
dir=/opt/ll-hls

необходимо назначить права доступа командой

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

...

/usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions

и перезапустить WCS,  чтобы применить изменения.

Максимальный размер LL HLS плейлиста

Максимальный размер LL HLS плейлиста в сегментах задается настройкой

Code Block
themeRDark
test_012.ts
test_013.ts
test_014.ts
test_015.ts
test_016.ts
test_017.ts
test_018.ts
test_019.ts

Использование оперативной памяти

...

ll_hls_list_size=12

По умолчанию размер LL HLS плейлиста равен 12 полным сегментам. Отметим, что, когда нарезка HLS только стартовала, количество полных сегментов в первых плейлистах будет меньше заданного.

Прелоадер для LL HLS

Начиная со сборки 5.2.1729, для LL HLS, как и для обычного HLS, может использоваться прелоадер

Code Block
themeRDark
hls_store_segment_in_memory=true

Для отправки подписчикам сегменты будут считываться из памяти. Необходимо отметить, что в этом случае потребуется больше памяти под Java heap для хранения сегментов.

В сборке 5.2.1713 хранение сегментов в оперативной памяти включено по умолчанию.

Отладочные логи для HLS-сессии

Для отчета об ошибке можно, используя CLI, включить сбор отладочных логов для HLS-сессий

Code Block
languagebash
themeRDark
update node-setting --value true hls_enable_session_debug

Следует учесть, что файл настроек flashphoner.properties будет перезаписан после этой команды.

Поддержка Low Latency HLS

...

preloader_enabled=true

Файлы прелоадера LL HLS по умолчанию помещаются в каталог

Code Block
themeRDark
ll_hls_preloader_dir=/usr/local/FlashphonerWebCallServer/ll-hls/.preloader

Расположение может быть изменено, например

Code Block
themeRDark
ll_hls_preloader_dir=/opt/preloader

По умолчанию, LL HLS прелоадер состоит из следующих файлов, по одному на каждое соотношение сторон видео потоков

Code Block
themeRDark
16x9.mp4
2x1.mp4
4x3.mp4

Если соотношение сторон публикуемого потока неизвестно, используется прелоадер с соотношением 16:9. Если файлы прелоадера отстутствуют, нарезка LL HLS будет начинаться без прелоадера, аналогично настройке

Code Block
themeRDark
hls_llpreloader_enabled=true
hls_new_http_stack=true

В этом случае плееры, которые поддерживают LL HLS (например, HLS.JS), будут играть дополнительные HLS сегменты и давать меньшую задержку по сравнению с плеерами, которые их не играют (например, VideoJS).

Для того, чтобы LL HLS проигрывался корректно, необходимо, как и для обычного HLS, обеспечить стабильный FPS публикуемого потока и стабильный интервал между ключевыми кадрами. Таким образом, исходный поток рекомендуется публиковать как RTMP с параметрами

Image Removed

Image Removed

Рекомендованные настройки сервера для LL HLS

Начиная со сборки 5.2.1345, рекомендуются следующие настройки для проигрывания Low latency HLS:

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 должен воспроизводиться с использованием HTTP/2, то есть через безопасное соединение

Code Block
themeRDark
https://wsc:8445/test/test.m3u8

В WCS также возможно использование HTTP/1 через небезопасное соединение

Code Block
themeRDark
http://wsc:8082/test/test.m3u8

Отметим, что LL HLS через HTTP/1 работает во всех основных браузерах, кроме Safari, поэтому не рекомендуется использовать эту возможность в промышленной эксплуатации.

Каталог для нарезки сегментов LL HLS

По умолчанию, сегменты LL HLS помещаются в подкаталоги с именами потоков в каталог

Code Block
themeRDark
ll_hls_dir=/usr/local/FlashphonerWebCallServer/ll-hls

...

false

Настройка собственного прелоадера

При необходимости, для LL HLS может быть настроен собственный прелоадер. Для этого необходимо подготовить файлы в трех основных аспектах 16:9, 4:3 и 2:1 согласно следующим требованиям:

  • контейнер MP4, кодек видео H264, кодек аудио AAC
  • файлы должны позволять немедленное проигрывание (MP4 атом moov должен быть перед атомом mdat)
  • файлы не должны содержать B-фреймов
  • длительность файла должна быть около 1 минуты
  • файл должен иметь ровный FPS
  • интервал между ключевыми кадрами должен быть около 2 секунд

Предполагается, что исходные файлы уже записаны в нужном аспекте, например, при помощи OBS Studio или подготовлены в видеоредакторе. Пример команды для преобразования файла под указанные требования:

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

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

Начиная со сборки 5.2.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_dir=/opt/ll-hls

необходимо назначить права доступа командой

Code Block
languagebash
themeRDark
/usr/local/FlashphonerWebCallServer/bin/webcallserver set-permissions

и перезапустить WCS,  чтобы применить изменения.

Максимальный размер LL HLS плейлиста

...

mp4=true

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

При необходимости, можно переключиться на использование ts контейнера

Code Block
themeRDark
ll_hls_fragmented_mp4=false

Использование общего сетевого стека для обычного и Low Latency HLS

В сборке 5.2.1749 добавлена настройка, разрешающая использование унифицированного сетевого стека для обычного HLS и Low latency HLS. Эта настройка включена по умолчанию:

Code Block
themeRDark
lluse_new_hls_list_size=12

По умолчанию размер LL HLS плейлиста равен 12 полным сегментам. Отметим, что, когда нарезка HLS только стартовала, количество полных сегментов в первых плейлистах будет меньше заданного.

...

=true

При этом:

  • по умолчанию используется контейнер m4s для записи сегментов
  • настройки с префиксом hls применяются и к обычному HLS,  и к LL HLS
  • настройки с префиксом ll_hls применяются к LL HLS и к контейнеру m4s
Warning

Начиная со сборки 5.2.

...

Code Block
themeRDark
hls_preloader_enabled=true

...

1793, данная настройка удалена. Для доставки HLS и LL HLS  сегментов используется унифицированный сетевой стек.

Настройка URL манифеста

Начиная со сборки 5.2.1852, можно задать шаблоны URL, по которому должен запрашиваться основной плейлист (манифест) потока. По умолчанию используются следующие шаблоны:

Code Block
themeRDark
ll_hls_preloaderpath_dirtemplate=/usr/local/FlashphonerWebCallServer/ll-hls/.preloader

Расположение может быть изменено, например

Code Block
themeRDark
ll_hls_preloader_dir=/opt/preloader

По умолчанию, LL HLS прелоадер состоит из следующих файлов, по одному на каждое соотношение сторон видео потоков

Code Block
themeRDark
16x9.mp4
2x1.mp4
4x3.mp4

...

{streamName}/{streamName}.m3u8
hls_abr_path_template={streamName}{abrSuffix}/{streamName}{abrSuffix}.m3u8

Здесь:

  • streamName - имя потока, опубликованного на сервере
  • abrSuffix - суффикс для ABR потока, заданный настройкой hls_abr_stream_name_suffix 

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

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

...

https://wcs:8445/stream/stream.m3u8

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

Code Block
themeRDark
https://wcs:8445/stream-HLS-ABR-STREAM/stream-HLS-ABR-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.1626 добавлена поддержка m4s контейнера для нарезки HLS сегментов, а в сборке 5.2.1632 поддержка данного контейнера включена и для HLS ABR1920 добавлена настройка, управляющая остановкой HLS провайдера при остановке публикации исходного потока. По умолчанию в этом случае HLS провайдер останавливается с задержкой

Code Block
themeRDark
hls_delayed_shutdown=true

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

Code Block
themeRDark
hls_list_size=8

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

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

Code Block
themeRDark
ll_hls_fragmenteddelayed_mp4shutdown=true

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

...

false

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

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

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

Code Block
themeRDark
ll_hls_fragmentedtime_mp4min=false

Использование общего сетевого стека для обычного и Low Latency HLS

2000

В сборке 5.2.1749 добавлена настройка, разрешающая использование унифицированного сетевого стека для обычного HLS и Low latency HLS. Эта настройка включена по умолчанию:.1974 добавлена возможность включить нарезку только по получению ключевых кадров

Code Block
themeRDark
use_new_hlshls_always_start_segment_with_key_frame=true

При этом :

  • по умолчанию используется контейнер m4s для записи сегментов
  • настройки с префиксом hls применяются и к обычному HLS,  и к LL HLS
  • настройки с префиксом ll_hls применяются к LL HLS и к контейнеру m4s

...

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

Code Block
themeRDark
hls_keep_min_segment_duration=true

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

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

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

...

Решение: начиная со сборки 5.2.1690, использовать контейнер m4s для потоков только с аудио

13. При использовании HLS ABR  под нагрузкой может возникать утечка ресурсов кодирования

Симптомы: при использовании HLS ABR, при большой нагрузке на CPU сервера (например, общее число профилей кодирования для всех опубликованных потоков превышает возможности CPU), после остановки публикаций ресурсы кодирования могут не освобождаться, это видно в статистике, например

Code Block
themeRDark
streams_hls=0
...
native_resources.video_encoders=5

Решение: обновить WCS до сборки 5.2.1947 и установить следующий параметр

Code Block
themeRDark
handler_async_disconnect=false