...
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 нарезку указанного потока |
Параметры
...
Имя параметра
...
Описание
...
Пример
...
name
...
Имя потока, опубликованного на сервере
...
test
...
Особенности
1. Если HLS нарезка потока запущена при помощи REST запроса /hls/startup, и нет активных HLS подписчиков, нарезка остановится по истечении интервала в секундах
Code Block | ||
---|---|---|
| ||
hls_manager_provider_timeout=300 |
По умолчанию, интервал составляет 5 минут. То же касается автоматически созданных HLS нарезок при установленной настройке
Code Block | ||
---|---|---|
| ||
hls_auto_start=true |
2. Если HLS нарезка потока останавливается при помощи REST запроса /hls/terminate, и есть активные HLS подписчики, то нарезка будет перезапущена. При этом активные HLS подписчики должны повторно подключиться к потоку.
Отображение сообщений о проблемах с LL HLS потоком
В сборке 5.2.1709 добавлена возможность вывода сообщений о проблемах с LL HLS потоком в ответ на REST API запрос /hls/find_all
:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"test": {
"handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler@74dbf27b",
"state": "ACTIVE",
"writer": "HLS-test",
"streamStatus": "PLAYING",
"writerStarted": "true",
"logs": [
"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 | ||
---|---|---|
| ||
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/profiles |
|
| 200 – OK 400 – Bad request 404 – Not found | Получить статистику профиля нарезки HLS | ||||||||||||||
/hls/subscribers |
|
| 200 – OK 400 – Bad request 404 – Not found | Получить список подписчиков на HLS нарезку |
Параметры
Имя параметра | Описание | Пример |
---|---|---|
name | Имя потока, опубликованного на сервере | test |
state | Статус HLS нарезки | ACTIVE |
logs | Сообщения о проблемах с LL HLS потоком | [] |
Особенности
1. Если HLS нарезка потока запущена при помощи REST запроса /hls/startup, и нет активных HLS подписчиков, нарезка остановится по истечении интервала в секундах
Code Block | ||
---|---|---|
| ||
hls_manager_provider_timeout=300 |
По умолчанию, интервал составляет 5 минут. То же касается автоматически созданных HLS нарезок при установленной настройке
Code Block | ||
---|---|---|
| ||
hls_auto_start=true |
2. Если HLS нарезка потока останавливается при помощи REST запроса /hls/terminate, и есть активные HLS подписчики, то нарезка будет перезапущена. При этом активные HLS подписчики должны повторно подключиться к потоку.
Отображение сообщений о проблемах с LL HLS потоком
В сборке 5.2.1709 добавлена возможность вывода сообщений о проблемах с LL HLS потоком в ответ на REST API запрос /hls/find_all
:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"test": {
"handler": "com.flashphoner.server.client.handler.wcs4.WCS4Handler@74dbf27b",
"state": "ACTIVE",
"writer": "HLS-test",
"streamStatus": "PLAYING",
"writerStarted": "true",
"logs": [
"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 | ||
---|---|---|
| ||
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 | ||||
---|---|---|---|---|
| ||||
[{
"id": "test",
"streamName": "test",
"status": "ACTIVE",
"waitingSize": 0,
"profiles": [
"a_test",
"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 | ||||
---|---|---|---|---|
| ||||
{
"offset":0,
"size":10
} |
Здесь
- offset - с какого элемента выводить список, по умолчанию 0
- size - максимальное колдичество выводимых элементов, по умолчанию 10
Данные об аудио и видео профилях нарезки
В ответ на запрос /hls/profiles
возвращается статистика аудио или видео профиля нарезки:
Code Block | ||||
---|---|---|---|---|
| ||||
{
"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": "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",
"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
} |
Здесь:
- 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 ABR
Для потоков с видео (только видео или видео+аудио) WCS поддерживает HLS ABR в CDN (в этом случае качества кодируются на выделенном Transcoder сервере) и на одном узле.
...