CDN 2.1¶
Описание¶
Новая реализация CDN 2.1 отличается от CDN 2.0 дополнительными возможностями:
- разделение узлов CDN по географическому (EU, US) или другому признаку при помощи групп
- выделение узлов под задачи транскодинга, назначая таким узлам роль Transcoder
Группировка узлов CDN¶
Серверы в CDN могут быть объединены в группу по географическому (расположение), аппаратному (использование GPU для транскодинга) и другим признакам. Группа указывается в файле настроек flashphoner.properties при помощи параметра
Один и тот же сервер может входить в несколько групп. Допустим, сервер находится в Европе и используется для транскодинга:
Группы узлов используются при выборе маршрута для воспроизведения потока.
Серверы, для которых не задана группа, считаются принадлежащими к одной безымянной группе
Выделение узлов под задачи транскодинга¶
Чтобы не загружать серверы, используемые для публикации и просмотра видео в крупной разветвленной CDN, задачами транскодинга, целесообразно выделить под эти задачи узлы с повышенной вычислительной мощностью. Для таких узлов, кроме Origin и Edge, добавлена роль Transcoder
Узел Transcoder не должен использоваться для публикации или воспроизведения потока. Он взаимодействует с Origin и Edge серверами следующим образом:
-
Поток публикуется на Origin сервер.
-
Transcoder забирает с Origin поток по запросу Edge сервера.
-
Transcoder транскодирует поток в соответствии с настройками, указанными Edge сервером.
-
Edge забирает с Transcoder поток для воспроизведения.
Конкретный узел для транскодирования выбирается при выборе маршрута для воспроизведения потока.
Профили транскодинга¶
Для настройки транскодинга на Edge сервере используются профили. Файл профилей транскодинга cdn_profiles.yml
должен располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf
на Edge сервере:
profiles:
-webrtc-144:
audio:
codec : opus
rate : 48000
video:
width : 256
height : 144
codecImpl : OPENH264
При запросе на воспроизведение потока, транскодированного по указанному профилю, имя профиля должно быть добавлено к имени потока, например
Рекомендуется для удобства задавать имена профилей, начинающиеся с дефиса.
Для применения изменений в файле cdn_profiles.yml
необходим перезапуск сервера.
Параметры профиля¶
Параметр | Допустимые значения | Описание |
---|---|---|
Параметры аудио | codec | opus mpeg4-generic speex ulaw | Используемый кодек аудио |
bitrate | Зависит от требуемого качества и пропускной способности каналов | Битрейт звука, бит/с |
rate | 8000 11025 12000 16000 22050 24000 32000 44100 48000 | Частота дискретизации звука |
channels | 1 2 | Количество каналов |
Параметры видео | ||
codec | ||
h264 mpv vp8 | Используемый кодек видео | |
bitrate | Зависит от требуемого качества и пропускной способности каналов | Битрейт видео, кбит/с |
width | Зависит от требуемого качества и пропускной способности каналов | Ширина картинки |
height | Зависит от требуемого качества и пропускной способности каналов | Высота картинки |
codecImpl | FF OPENH264 | Используемый кодек видео, по умолчанию FF |
gop | Зависит от требуемого качества и пропускной способности каналов | Частота отправки ключевых кадров (GOP) |
fps | Зависит от требуемого качества и пропускной способности каналов | Частота кадров |
quality | Зависит от требуемого качества и пропускной способности каналов | Качество видео |
preset | ultrafast superfast veryfast faster fast medium slow slower veryslow placebo | Пресет FF, по умолчанию ultrafast |
profile | 66 (Baseline) 77 (Main) 88 (Extended) 100 (High) | Профиль кодирования FF, по умолчанию 66 (Baseline) |
level | Зависит от требуемого качества | Уровень кодирования FF, по умолчанию 3.1 |
Если ширина картинки не указана или равна 0, видео масштабируется по указанной высоте, с сохранением соотношения сторон.
Если ширина и высота картинки обе равны 0, видео масштабируется к разрешению 160x120.
Управление параметрами кодирования¶
При использовании кодировщика FF можно выбрать предустановки (пресет) кодирования, профиль и уровень кодирования. Например, следующие параметры
profile1:
audio:
codec : opus
rate : 48000
video:
width : 640
height : 360
gop : 90
fps : 30
codec : h264
profile : 77
level : 31
preset : veryfast
задают использование пресета veryfast
, профиля Main
и уровня 3.1
Тонкая настройка кодирования¶
По умолчанию, кодирование видео производится одним потоком. При использовании относительно медленных пресетов с высоким качеством кодирования (например, пресет fast
) возникает необходимость кодирования в несколько потоков, в противном случае на стороне подписчика видео может играть с низким FPS и рассинхронизацией. Начиная со сборки 5.2.347, для того, чтобы автоматически запускать кодирование в несколько потоков в зависимости от разрешения, заказанного подписчиком, предусмотрена настройка
Данная настройка задается как произведение высоты картинки на ширину. По умолчанию, видеопотоки 720p и выше будут кодироваться в два потока. Для того. чтобы уменьшить этот порог до 480p, необходимо установить настройку как 640 * 480 = 307200
В этом случае видеопотоки 480p и более высокого разрешения будут кодироваться в два потока.
Количество потоков для кодирования задается настройкой
По умолчанию, максимальное количество потоков кодирования равно 2.
Вышеописанные настройки указываются на Transcoder узлах.
Поддержка нескольких каналов звука¶
Начиная со сборки 5.2.773, поддерживается транскодирование звука по профилю с указанием количества каналов (1 - моно, 2 - стерео)
profiles:
-240p:
audio:
codec : mpeg4-generic
rate : 48000
channels: 1
video:
height : 240
bitrate : 300
gop : 50
codec : h264
Для того, чтобы подписчик на Edge сервере мог играть стерео звук при публикации потока со стерео звуком, количество каналов в профиле должно соответствовать количеству каналов в оригинальном потоке, т.е.
Если кодек, частота дискретизации и количество каналов профиля совпадают с параметрами звуковой дорожки в оригинальном потоке, то звук будет передан на Edge сервер без транскодирования.
Управление профилями транскодинга при помощи REST API¶
Для управление профилями транскодинга на лету, без перезапуска сервера, служит специальное REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP:
http://test.flashphoner.com:8081/rest-api/cdn/profile/print
- HTTPS:
https://test.flashphoner.com:8444/rest-api/cdn/profile/print
Здесь:
test.flashphoner.com
- адрес WCS-сервера8081
- стандартный REST / HTTP порт WCS-сервера8444
- стандартный HTTPS портrest-api
- обязательная часть URL/cdn/profile/print
- используемый REST-метод
REST запросы необходимо отправлять на Edge сервер. Изменения в профилях сохраняются в памяти и применяются немедленно, а также записываются в файл cdn_profiles.yml
для использования после перезапуска сервера.
REST-методы и статусы ответа¶
/cdn/profile/add¶
Добавить профиль транскодинга
Request example¶
POST /rest-api/cdn/profile/add HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"name": "-profile1",
"profile": {
"audio": {
"type": "audio",
"bitrate": 0,
"codec": "opus",
"rate": 48000
},
"video": {
"type": "video",
"bitrate": 0,
"codec": "h264",
"codecImpl": "FF",
"fps": 30,
"gop": 90,
"height": 360,
"quality": 0,
"width": 640
}
}
}
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
400 | Bad request |
409 | Conflict |
500 | Internal error |
/cdn/profile/modify¶
Изменить профиль транскодинга
Request example¶
POST /rest-api/cdn/profile/modify HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"name": "-profile1",
"profile": {
"video": {
"bitrate": 400,
"quality": 25
}
}
}
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
400 | Bad request |
409 | Conflict |
500 | Internal error |
/cdn/profile/print¶
Получить список профилей транскодирования
Request example¶
Response example¶
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json
[
"-240p": {
"audio": {
"bitrate": 0,
"channels": 0,
"codec": "opus",
"rate": 48000,
"type": "audio"
},
"video": {
"bitrate": 0,
"codec": "h264",
"codecImpl": "FF",
"fps": 25,
"gop": 50,
"height": 240,
"preset": "veryfast",
"quality": 0,
"type": "video",
"width": 0
}
},
"-480p": {
"audio": {
"bitrate": 0,
"channels": 0,
"codec": "opus",
"rate": 48000,
"type": "audio"
},
"video": {
"bitrate": 0,
"codec": "h264",
"codecImpl": "FF",
"fps": 25,
"gop": 50,
"height": 480,
"preset": "veryfast",
"quality": 0,
"type": "video",
"width": 0
}
}
]
Return codes¶
Code | Reason |
---|---|
200 | OK |
404 | Not found |
500 | Internal error |
/cdn/profile/remove¶
Удалить профиль транскодирования
Request example¶
POST /rest-api/cdn/profile/remove HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"name": "-profile1"
}
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
404 | Not found |
500 | Internal error |
Параметры¶
Параметр | Описание | Пример |
---|---|---|
name | Имя профиля |
-profile1
|
profile | Параметры профиля |
Параметры профиля обязательно должны содержать разделы audio
или video
.
Основными параметрами профиля являются следующие:
- audio:
- bitrate
- codec
- rate
- video:
- bitrate
- codec
- width
- height
- quality
Если какие-либо из этих параметров не указаны при создании профиля, они будут добавлены в профиль со значением 0
для числовых и ""
для строковых параметров, при этом будут применены значения по умолчанию.
Остальные параметры являются дополнительными и могут отсутствовать в профиле:
- video:
- codecImpl
- fps
- gop
- level
- preset
- profile
При изменении профиля изменяются только переданные параметры. Для сброса какого-либо из основных параметров к значению по умолчанию, либо для удаления из профиля дополнительного параметра необходимо передать -1
, например:
Изменение используемых профилей¶
Если по профилю в данный момент воспроизводится поток, изменение профиля возможно только после окончания воспроизведения потока и остановки агента, т.е. приблизительно через минуту после того, как от потока отключился последний подписчик.
В каких случаях поток транскодируется на Edge сервере¶
Транскодинг потока на Edge сервере включается в следующих случаях:
-
Если аудио кодека или частоты дискретизации, указанных в настройках профиля, нет в SDP подписчика, аудио дорожка будет транскодирована в один из форматов, поддерживаемых подписчиком.
-
Если заданы граничные параметры для подписчика: например, высота или битрейт видео. Поэтому при транскодировании по профилю желаемые граничные параметры следует указывать в профиле и не задавать для подписчиков.
Для подписчика следует применять профиль, соответствующий технологии, используемой подписчиком. Например, для подписчика, использующего WSPlayer, применить профиль с кодеками ulaw
и mpv
, а для RTMP - mpeg4-generic
и h264
.
Сохранение соотношения сторон видео при транскодировании по профилю¶
Если на всех узлах CDN включено сохранение соотношения сторон при транскодировании (по умолчанию), то при транскодировании потока на Transcoder узле также будет сохранено исходное соотношение сторон, с которым этот поток был опубликован на Origin. Например, если к потоку 640x480 (4:3) применяется профиль 16:9
profile1:
audio:
codec : opus
rate : 48000
video:
width : 320
height : 180
gop : 90
fps : 30
codec : h264
поток будет транскодирован в 320x240 (4:3).
В этом случае можно не указывать ширину кадра в профиле транскодирования, поскольку ширина будет выбрана, исходя из соотношения сторон. Например, допускается такой профиль
Настройка транскодеров для работы в условиях больших нагрузок¶
При транскодинге большого количества потоков на сервере возрастает нагрузка на процессор сервера. Если процессор не успевает обрабатывать кадры всех потоков, очереди кадров на кодирование занимают оперативную память сервера (не JVM heap!). В зависимости от используемых в системе библиотек распределения памяти (malloc) это может приводить к утечкам памяти и, как следствие, к остановке сервера.
Чтобы избежать этого, предусмотрены следующие настройки, которые рекомендуется использовать совместно:
- приостановка декодирования входящих потоков, если очереди на кодирование переполнены
- использование библиотеки jemalloc
Приостановка декодирования входящих потоков¶
Приостановка декодирования входящих потоков дает возможность сгладить (но не ликвидировать) пиковые нагрузки на сервер, при условии выставления этих настроек для группы транскодеров, и включается при помощи следующего параметра
Размер очереди, по достижении которого декодирование приостанавливается, задается в кадрах следующей настройкой
Интервал ожидания освобождения очереди задается в миллисекундах
Использование библиотеки jemalloc для распределения памяти¶
По умолчанию, в большинстве случаев используется библиотека распределения памяти, входящая в состав glibc. Чтобы избежать утечек памяти под большими нагрузками, рекомендуется переключить Transcoder узлы на использование библиотеки jemalloc следующим образом (на примере Centos 7):
-
Установить компоненты, необходимые для сборки
-
Скачать исходный код библиотеки
-
Распаковать архив
-
Собрать библиотеку
-
В файле /usr/local/FlashphonerWebCallServer/bin/setenv.sh` закомментировать следующую строку
и добавить следующую строку
-
В файле настроек flashphoner.properties переключить используемый декодер на OpenH264
- Перезапустить WCS
Снижение порога многопоточного кодирования¶
По умолчанию, многопоточное кодирование включается для профилей 720p. В некоторых случая необходимо снизить этот порог, чтобы кодировать по профилям 480p также в два и более потоков
Уменьшение количества выделений памяти при декодировании¶
Для уменьшения количества выделений памяти при декодировании в сборке 5.2.559 добавлена возможность использования пула буферов для декодированных картинок. Эта возможность включается настройкой
В этом случае под каждое разрешение картинки выделяется пул буферов. По окончании использования буфера, он не удаляется, а возвращается в пул. Чтобы получить информацию об использовании памяти, необходимо включить вывод статистики при помощи настройки
Статистика доступна по запросу (только в формате JSON)
и сгруппирована по пулам
{
"decoder_buffer_pool_stats": {
"decoder_buffer_pool_info": {
"decoder_buffer_pool_info_pools": {
"3072x1536": {
"decoder_buffer_pool_width": 3072,
"decoder_buffer_pool_height": 1536,
"decoder_buffer_pool_size_bytes": 84934656,
"decoder_buffer_pool_leased": 6,
"decoder_buffer_pool_allocated": 12
},
"1280x720": {
"decoder_buffer_pool_width": 1280,
"decoder_buffer_pool_height": 720,
"decoder_buffer_pool_size_bytes": 688584704,
"decoder_buffer_pool_leased": 0,
"decoder_buffer_pool_allocated": 3605
}
},
"decoder_buffer_pool_total_size_bytes": 773519360
}
}
}
Здесь
decoder_buffer_pool_total_size_bytes
- общий размер памяти, выделенной под пулы, в байтахdecoder_buffer_pool_width
- высота картинкиdecoder_buffer_pool_height
- ширина картинкиdecoder_buffer_pool_size_bytes
- размер памяти, выделенной под пул, в байтахdecoder_buffer_pool_leased
- количество используемых буферовdecoder_buffer_pool_allocated
- количество выделенных буферов в пуле
Освобождение памяти, выделенной под неиспользуемые буфера¶
При необходимости, память, выделенная под неиспользуемые буфера, может быть очищена при помощи REST API запроса /debug/decoder/shrink_buffer_provider_pools
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP:
http://test.flashphoner.com:8081/rest-api/debug/decoder/shrink_buffer_provider_pools
- HTTPS:
https://test.flashphoner.com:8444/rest-api/debug/decoder/shrink_buffer_provider_pools
Здесь:
test.flashphoner.com
- адрес WCS-сервера8081
- стандартный REST / HTTP порт WCS-сервера8444
- стандартный HTTPS портrest-api
- обязательная часть URL/debug/decoder/shrink_buffer_provider_pools
- используемый REST-метод
REST запросы необходимо отправлять на Transcoder сервер.
Request example¶
POST /rest-api/debug/decoder/shrink_buffer_provider_pools HTTP/1.1
Host: localhost:8081
Content-Type: application/json
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
500 | Internal error |
Транскодирование по двум и более профилям с одинаковыми параметрами видео¶
На Edge узлах могут быть определены несколько профилей с одинаковыми параметрами видео, но различными параметрами аудио, например для воспроизведения по HLS и WebRTC:
-240p-HLS:
audio:
codec: mpeg4-generic
video:
height: 240
bitrate: 300
codec: h264
-240p-WebRTC:
audio:
codec: opus
video:
height: 240
bitrate: 300
codec: h264
В этом случае, если поток транскодируется на одном и том же Transcoder узле по двум таким профилям, будет использован один кодировщик видео и два кодировщика аудио.
Предотвращение транскодирования к более высоким разрешениям¶
В сборке 5.2.607 добавлена возможность избежать транскодирования потока к более высоким разрешениям. Эта возможность включается при помощи настройки
В этом случае, если с Edge сервера запросить поток, опубликованный на Origin с разрешением 640x480, по профилю 720p, Edge получит оригинальный поток напрямую с Origin без транскодирования. Сравнение разрешений производится по высоте.
При необходимости, можно запретить запрашивать c Edge поток по профилям с более высоким разрешением при помощи параметра
Тогда при попытке запросить с Edge поток, опубликованный на Origin с разрешением 640x480, по профилю 720p, Edge не сможет выбрать маршрут для воспроизведения потока, и клиент получит ошибку.
Эти настройки должны указываться на Edge сервере.
Ограничения¶
- Если транскодирование к более высоким разрешениям запрещено, в настройках профиля транскодирования обязательно должна быть указана высота.
Выбор маршрута для воспроизведения потока¶
Маршруты в CDN строятся на основе периодических рассылок следующих данных:
- Origin рассылает узлам с ролью Transcoder и Edge информацию об опубликованных потоках;
- Transcoder рассылает узлам с ролью Edge в пределах той же группы информацию о потоках, которые уже захвачены им с Origin;
- Edge не рассылает ничего и всегда является конечной точкой маршрута.
Схема рассылки данных для составления маршрутов
Маршрут для воспроизведения потока на Edge сервере выбирается следующим образом:
-
Если на Edge сервере настроен профиль транскодирования:
- 1.1. Если на Transcoder в одной группе с Edge есть поток с таким именем:
- 1.1.1. Если поток уже транскодируется по указанному профилю, Edge забирает поток с Transcoder
- 1.1.2. Если поток транскодируется по другому профилю:
- 1.1.2.1. Поток транскодируется по указанному профилю
- 1.1.2.2. Edge забирает поток с Transcoder
- 1.2. Если Transcoder в одной группе с Edge может забрать запрошенный поток с Origin:
- 1.2.1. Transcoder забирает поток с Origin
- 1.2.2. Поток транскодируется по указанному профилю
- 1.2.3. Edge забирает поток с Transcoder
- 1.3. В остальных случаях Edge забирает поток с Origin
- 1.1. Если на Transcoder в одной группе с Edge есть поток с таким именем:
-
Если на Edge сервере не настроен профиль транскодирования, Edge забирает поток с Origin
Пример распределения потоков в CDN с использованием Transcoder узлов¶
Здесь
stream1
,stream2
,stream3
- потоки. опубликованные на Originstream1-P1
- поток stream1, транскодированный по профилю P1stream2-P1
- поток stream1, транскодированный по профилю P2
Группировка узлов и транскодинг¶
По умолчанию, для транскодирования потока по профилю, Edge выбирает Transcoder в той же группе. Например, если CDN имеет два сегмента, сгруппированных по географическому признаку: в Европе и в США, потокораспределение при запросе одного и того же потока по одному и тому же профилю из каждой группы будет выглядеть следующим образом:
При этом в каждую из групп с Origin транслируется только один поток, что снижает нагрузку на межгрупповые каналы, но транскодинг выполняется в каждой группе независимо.
Данное поведение может быть изменено при помощи настройки
Эта настройка должна быть включена на Transcoder и Edge-узлах.
Тогда для транскодирования потока в первую очередь будет выбираться Transcoder в одной группе с Origin, потокораспределение будет выглядеть следующим образом:
При этом поток транскодируется централизованно для всех географических областей, но в каждую группу будет транслироваться столько потоков, сколько было запрошено с Edge для воспроизведения. Это увеличит нагрузку на межгрупповые каналы.
Начиная с версии 5.2.418, если Transcoder из той же группы, что Origin не будет доступен, для транскодирования потока будет выбираться Transcoder из группы Edge, или при недоступности Transcoder и из группы Edge, любой другой доступный Transcoder. Таким образом, Edge сможет забрать транскодированный поток вне зависимости от того, есть ли доступные Transcoder-узлы в группах Origin или Edge.
Приоритет групп при выборе доступного Transcoder для транскодирования нового потока будет следующим:
- Первая группа, указанная на Origin (другие группы не учитываются - приоритет переходит к группе Edge)
- Группы Edge (если Transcoder из первой группы недоступен, то приоритет переходит ко второй и так далее)
- Другие группы (равный приоритет)
Однако, если запрошенный поток уже транскодируется на другом Transcoder, чем приоритетный для этого Edge, то этот поток будет забран с того Transcoder, на котором уже осуществляется транскодирование.
Получение информации о маршрутах с помощью REST API¶
Для получения информации о маршрутах используется REST API запрос /cdn/stream/show_routes
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP:
http://test.flashphoner.com:8081/rest-api/cdn/stream/show_routes
- HTTPS:
https://test.flashphoner.com:8444/rest-api/cdn/stream/show_routes
Здесь:
test.flashphoner.com
- адрес WCS-сервера8081
- стандартный REST / HTTP порт WCS-сервера8444
- стандартный HTTPS портrest-api
- обязательная часть URL/cdn/show_stream_routes
- используемый REST-метод
REST-методы и статусы ответа¶
/cdn/stream/show_routes¶
Показать активные маршруты CDN
Request example¶
POST /rest-api/cdn/stream/show_routes HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"streamName":"test-webrtc-144"
}
Response example¶
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json
{
"REQUESTED-PROFILE": [
"AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
"VIDEO{width=256, height=144, gop=null, fps=null, bitrate=0, codec='h264', codecImpl='OPENH264', quality=null}"
],
"1-PROFILE-192.168.1.220": [
"AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
"VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='null', quality=null}",
"VIDEO{width=320, height=180, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='FF', quality=null}",
"VIDEO{width=256, height=144, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='OPENH264', quality=null}"
],
"2-STREAM-192.168.1.220": [
"AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
"VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}",
"VIDEO{width=320, height=180, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='FF', quality=null}",
"VIDEO{width=256, height=144, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='OPENH264', quality=null}"
],
"3-NEW-TRANSCODER-192.168.1.220": [],
"4-PROXY-192.168.1.219": [
"AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}",
"VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}"
]
}
Return codes¶
Code | Reason |
---|---|
200 | OK |
500 | Internal error |
Параметры¶
Описание | Пример |
---|---|
Имя потока (c указанием профиля, при необходимости) |
test-webrtc-144
|
Параметры запрашиваемого профиля транскодирования | |
Параметры запрашиваемого профиля |
REQUESTED-PROFILE
|
Параметры аудио, указанные в профиле |
AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}
|
Параметры видео, указанные в профиле |
VIDEO{width=256, height=144, gop=null, fps=null, bitrate=0, codec='h264', codecImpl='OPENH264', quality=null}
|
Параметры потока на Transcoder | |
Параметры профилей транскодирования, используемых в данный момент на Transcoder |
1-PROFILE-192.168.1.220
|
Параметры потока, который Transcoder забрал с Origin |
2-STREAM-192.168.1.220
|
Параметры профиля аудио |
AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}
|
Параметры профиля видео (в соответствии с работающими в данный момент профилями транскодирования) |
VIDEO{width=320, height=180, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='FF', quality=null}
|
Параметры потока, который Trancoder может забрать с Origin |
3-NEW-TRANSCODER-192.168.1.220
|
Параметры потока на Origin | |
Параметры потока, который опубликован на Origin |
4-PROXY-192.168.1.219
|
Параметры аудио |
AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}
|
Параметры видео |
VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}
|
Примеры разбора маршрутов воспроизведения потока¶
Рассмотрим несколько примеров построения маршрутов для воспроизведения потока в CDN.
В качестве примера возьмем CDN из трех узлов:
192.168.1.219
- Origin192.168.1.220
- Transcoder192.168.1.221
- Edge
На Origin публикуется WebRTC H264+opus (48 кГц, стерео) поток test
Воспроизведение потока с Origin без транскодинга при совпадении профилей публикации и воспроизведения¶
Воспроизводим поток test
на Edge по профилю
В ответ на запрос
POST /rest-api/cdn/stream/show_routes HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"streamName": "test-webrtc-opus-video-proxy"
}
получаем:
-
Запрашиваемый профиль:
-
Поток захватывается с Origin:
-
Поток может быть захвачен через Transcoder:
-
Но захвачен с Origin, поскольку параметры публикации потока совпадают с запрошенными параметрами воспроизведения:
Воспроизведение потока с Transcoder с транскодингом звука¶
Воспроизводим поток test
на Edge по профилю
В ответ на запрос
POST /rest-api/cdn/stream/show_routes HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"streamName": "test-webrtc-pcma-video-proxy"
}
получаем:
-
Запрашиваемый профиль:
-
На Transcoder создан профиль транскодирования:
-
Поток захватывается через Transcoder:
-
Параметры публикации потока на Origin:
Воспроизведение потока с Transcoder с транскодингом видео¶
Воспроизводим поток test
на Edge по профилю
-opus-vp8:
audio:
codec : opus
rate : 48000
channels : 2
video:
width : 320
height : 240
gop : 60
fps : 30
codec : vp8
codecImpl : FF
В ответ на запрос
POST /rest-api/cdn/stream/show_routes HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"streamName": "test-webrtc-opus-vp8"
}
получаем:
-
Запрашиваемый профиль:
-
На Transcoder создан профиль транскодирования:
-
Поток захватывается через Transcoder:
"2-STREAM-192.168.1.220": [ "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}", "VIDEO{width=0, height=0, gop=null, fps=null, bitrate=0, codec='H264', codecImpl='', quality=null}", "VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='VP8', codecImpl='FF', quality=null}" ], "3-NEW-TRANSCODER-192.168.1.220": [],
-
Параметры публикации потока на Origin:
Анонсирование потока в CDN по получению ключевого кадра¶
По умолчанию, потоки, опубликованные на Origin узлах, анонсируются в CDN и становятся доступными для построения маршрутов и проигрывания сразу после публикации. При этом разрешение и соотношение сторон картинки видеопотока неизвестны до тех пор, пока публикующий клиент не пришлет ключевой кадр.
В некоторых случаях, на Edge узлах необходимо знать разрешение и соотношение сторон потока, как только он стал доступен в CDN. Для этого, начиная со сборки 5.2.404, Origin может анонсировать поток только после получения ключевого кадра. Эта возможность включается настройкой
Отметим, что аудио потоки (без видеодорожки) не будут доступны в CDN при такой настройке, поскольку не содержат ключевых кадров.
Распределение нагрузки по Transcoder узлам¶
Определение загрузки узла, исходя из загрузки процессора¶
Если в CDN входят несколько Transcoder узлов с одинаковыми профилями, нагрузка по таким узлам распределяется, исходя из загрузки процессора. Максимально допустимая загрузка конкретного Transcoder узла определяется настройкой
Эта величина задает соотношение между средней загрузкой процессора (параметр JVM SystemLoadAverage) и количеством процессорных ядер с учетом гипертрединга. Если значение превышено, Transcoder перестает участвовать в выборе маршрута для новых потоков и профилей. При этом в секции PROFILE
данный узел отображается в маршрутах потока для тех профилей, по которым уже транскодируется этот поток.
Текущее состояние узла (участвует ли он в выборе маршрута для новых потоков) можно определить при помощи REST API. Узел в статусе NEW_STREAMS_ALLOWED
может принимать новые потоки для транскодирования, узел в статусе GROUP_CONNECTION_ALLOWED
может только отдавать потоки, которые на нем уже транскодируются.
Настройка должна задаваться на Transcoder узлах. Также эта настройка может задаваться на Origin узлах, в этом случае при помощи REST API можно контролировать загрузку Origin сервера и при достижении статуса GROUP_CONNECTION_ALLOWED
публиковать потоки на другом Origin сервере.
Ограничение количества кодировщиков (encoders) видео на Transcoder узлах¶
При необходимости, на Transcoder узлах может быть ограничено максимальное количество одновременно используемых кодировщиков (encoders) видео при помощи настройки
При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED
. Учитываются все кодировщики на сервере, например, если один поток транскодируется по двум профилям, будет использовано 3 кодировщика, включая кодировщик PNG.
Настройка должна задаваться на Transcoder узлах
Ограничение общей нагрузки на декодирование¶
В сборке 5.2.594 добавлена возможность установить ограничение по величине общей нагрузки на декодирование потоков. Например, для того, чтобы разрешить декодирование не более чем 20 потоков 1080p 30 fps, необходимо установить следующее значение
что соответствует произведению
При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED
.
Настройка должна задаваться на Transcoder узлах.
Ограничение общей нагрузки на кодирование¶
В сборке 5.2.594 добавлена возможность установить ограничение по величине общей нагрузки на кодирование потоков. Например, для того, чтобы разрешить кодирование не более чем 20 потоков 720p, 480p и 240p 25 fps, необходимо установить следующее значение
что соответствует сумме
При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED
.
Настройка должна задаваться на Transcoder узлах.
Ограничение процента деградации потоков¶
В сборке 5.2.594 добавлена возможность установить ограничение на процент деградации потоков. Например, для того, чтобы остановить прием новых потоков на транскодирование при деградации 10% потоков на сервере, необходимо установить следующее значение
При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED
. Необходимо отметить, что потоки начинают деградировать, как правило, из-за того, что кодировщику либо декодировщику не хватает производительности, и очереди картинок на кодирование/декодирование к моменту деградации вырастают до больших значений, что ведет к расходованию оперативной памяти. Таким образом, следует использовать этот параметр только как дополнительный к ограничениям общей нагрузки на кодирование/декодирование.
Настройка должна задаваться на Transcoder узлах.
Равномерное распределение нагрузки по узлам¶
Для того, чтобы потоки по доступным Transcoder узлам распределялись равномерно, для транскодирования нового потока выбирается следующий свободный узел (алгоритм Round Robin). При этом, чтобы один и тот же опубликованный поток при одновременном запросе с нескольких клиентов не расходился по нескольким Transcoder узлам, предусмотрено кэширование по имени потока. Интервал времени кэширования задается в миллисекундах при помощи настройки
В данном случае интервал кэширования составит 10 секунд.
Настройка должна задаваться на Transcoder узлах
Предотвращение транскодирования на Origin¶
Для того, чтобы Origin узлы не принимали на себя транскодинг, если все Transcoder узлы заняты, предусмотрена настройка
В данном случае (по умолчанию), если для транскодирования нового потока по указанному профилю нет доступных Transcoder узлов, поток не будет играться с ошибкой No available transcoders
.
При необходимости, транскодирование на Origin серверах можно разрешить
Эта настройка должна задаваться на Edge узлах.
Управление текущим состоянием узла при помощи REST API¶
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
- HTTP:
http://test.flashphoner.com:8081/rest-api/cdn/show_nodes
- HTTPS:
https://test.flashphoner.com:8444/rest-api/cdn/show_nodes
Здесь:
test.flashphoner.com
- адрес WCS-сервера8081
- стандартный REST / HTTP порт WCS-сервера8444
- стандартный HTTPS портrest-api
- обязательная часть URL/cdn/show_nodes
- используемый REST-метод
/cdn/show_nodes¶
Показать состояние узлов CDN
Request example¶
Response example¶
HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/json
[
{
"globalState": "ACTIVE",
"id": "192.168.1.64",
"processingState": "NEW_STREAMS_ALLOWED",
"role": "TRANSCODER"
},
{
"globalState": "ACTIVE",
"id": "192.168.1.39",
"processingState": "NEW_STREAMS_ALLOWED",
"role": "ORIGIN"
}
]
Return codes¶
Code | Reason |
---|---|
200 | OK |
500 | Internal error |
/cdn/show_state¶
Показать состояние узла CDN, которому направлен запрос
Request example¶
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
500 | Internal error |
/cdn/enforce_state¶
Принудительно изменить состояние узла (использовать с осторожностью!)
Request example¶
POST /rest-api/cdn/enforce_state HTTP/1.1
Host: localhost:8081
Content-Type: application/json
{
"state": "GROUP_CONNECTIONS_ALLOWED"
}
Response example¶
Return codes¶
Code | Reason |
---|---|
200 | OK |
500 | Internal error |
Параметры¶
Параметрr | Описание | Пример |
---|---|---|
globalState |
Статус узла: ACTIVE или PASSIVE
|
ACTIVE
|
id | Адрес узла |
192.168.1.64
|
processingState, state |
Участвует ли узел в выборе маршрута для воспроизведения потоков: - NEW_STREAMS_ALLOWED - участвует- CONNECTION_ALLOWED - позволяет только забирать уже транскодируемые потоки, в том числе по новым профилям- GROUP_CONNECTION_ALLOWED - не участвует
|
NEW_STREAMS_ALLOWED
|
role |
Роль узла: ORIGIN , TRANSCODER или EDGE
|
ORIGIN
|
Запрос /cdn/show_nodes
может быть направлен определенному узлу, в ответ узел вернет состояния всех видимых ему узлов CDN, кроме себя самого.
Запрос /cdn/enforce_state
позволяет принудительно изменить состояние узла, например, вывести определенный транскодер из выбора маршрутов. Узел также можно полностью вывести из CDN запросом
POST /rest-api/cdn/enforce_state HTTP/1.1
Content-Length: 20
Content-Type: application/json
{
"state": "PASSIVE"
}
а затем ввести обратно
POST /rest-api/cdn/enforce_state HTTP/1.1
Content-Length: 19
Content-Type: application/json
{
"state": "ACTIVE"
}
Для сброса заданного состояния необходимо передать пустое тело запроса
Вычисление текущего состояния узла и его рассылка¶
Текущее состояние узла определяется следующим образом в порядке приоритета:
1. Если есть значение, заданное принудительно при помощи запроса /cdn/enforce_state
, то выбирается это значение.
2. Если достигнуто ограничение по нагрузке процессора, то выбирается состояние GROUP_CONNECTIONS_ALLOWED
.
3. Если достигнуто ограничение по кодировщикам видео, то выбирается состояние GROUP_CONNECTIONS_ALLOWED
.
4. Если ограничения не достигнуты, то выбирается состояние NEW_STREAMS_ALLOWED
.
Узел рассылает свое состояние другим узлам с периодичностью, заданной в миллисекундах при помощи настройки
По умолчанию, периодичность рассылки составляет 60 секунд. Для Transcoder узлов рекомендуется уменьшить это значение до 1 секунды, чтобы своевременно распределять потоки на другие узлы.
Настройка состояния Transcoder узла при достижении ограничений по производительности¶
В сборке 5.2.640 добавлена настройка, позволяющая указать состояние, в которое перейдет Transcoder узел при достижении любого из ограничений, по умолчанию GROUP_CONNECTIONS_ALLOWED
При необходимости, чтобы предотвратить размазывание потока по CDN, можно переводить Transcoder в состояние CONNECTIONS_ALLOWED
В этом состоянии, Transcoder будет позволять забирать потоки, которые уже на нем декодируются, в том числе по новым профилям. Например, если на Transcoder узле транскодируется поток test
по профилю 360p, и какой-либо Edge сервер запросит поток test240p
, маршрут для воспроизведения будет построен через этот же Transcoder.
Данная настройка должна устанавливаться на Transcoder узлах.
Авторизация узлов в CDN¶
Авторизация узлов, которые пытаются подключиться к CDN, производится по IP-адресу. Адреса узлов, которые могут войти в CDN, должны быть указаны в следующей настройке
Также в этой настройке могут быть указаны маски адресов, например
Каждый узел CDN, на котором указана данная настройка, будет принимать соединения только от тех узлов, чьи адреса совпадают с перечисленными либо подходят под указанные маски. Соединения с прочими узлами будут отвергнуты.
Обратная совместимость с CDN 2.0¶
Обратная совместимость CDN 2.1 с CDN 2.0 поддерживается для следующих случаев:
-
Edge 2.0 может забирать потоки с Origin 2.1
-
Edge 2.1 может забирать потоки с Origin 2.0
При этом транскодинг работает согласно настройке кодеков и SDP по принципам, определенным для CDN 2.0.
Ограничения¶
-
Не рекомендуется публиковать поток с одним и тем же именем на двух Origin серверах одной CDN
-
Поток, опубликованный на одном из Origin серверов, следует забирать с этого же Origin или Edge сервера (в том числе через Transcoder сервер), но не с другого Origin сервера в той же CDN.
Принудительное указание версии CDN, поддерживаемой узлом¶
В сборке 5.2.341 добавлена настройка, позволяющая принудительно указать версию CDN, которую поддерживает данный узел
По умолчанию, установлена версия 2.0. Далее узел динамически, в зависимости от роли (Transcoder) и настройки ACL, устанавливает поддерживаемую версию в 2.1 или 2.2.
Для того, чтобы узел Edge быстрее определял роль узла Transcoder, рекомендуется на узле Transcoder принудительно указать версию 2.1
или 2.2, если в CDN используются правила ACL
Warning
В сборке 5.2.471 поведение данной настройки изменилось.
Известные проблемы¶
1. При использовании кодировщика FF в первых кадрах транскодированного потока могут быть макроблоки¶
Симптомы
При использовании профилей транскодинга в первых кадрах потока зритель видит макроблоки
Решение
a) указать в профиле параметр quality
profiles:
-240p:
audio:
codec : opus
rate : 48000
video:
height : 240
gop : 50
fps : 25
codec : h264
preset : veryfast
quality : 25
codecImpl : FF
b) если необходимо удерживать при транскодинге заданное значение битрейта видео, использовать кодировщик OPENH264
2. Настройка качества кодирования не применяется при использовании OpenH264¶
Симптомы
Качество картинки не изменяется при различных значениях quality
в профиле транскодирования