Новая реализация CDN 2.1 отличается от CDN 2.0 дополнительными возможностями:
Серверы в CDN могут быть объединены в группу по географическому (расположение), аппаратному (использование GPU для транскодинга) и другим признакам. Группа указывается в файле настроек flashphoner.properties при помощи параметра
cdn_groups=group1 |
Один и тот же сервер может входить в несколько групп. Допустим, сервер находится в Европе и используется для транскодинга при помощи GPU:
cdn_groups=EU,GPU |
Группы узлов используются при выборе маршрута для воспроизведения потока
Серверы, для которых не задана группа, считаются принадлежащими к одной группе
Чтобы не загружать серверы, используемые для публикации и просмотра видео в крупной разветвленной CDN, задачами транскодинга, целесообразно выделить под эти задачи узлы с повышенной вычислительной мощностью. Для таких узлов,, кроме Origin и Edge, добавлена роль Transcoder.
cdn_role=transcoder |
Узел Transcoder не должен использоваться для публикации или воспроизведения потока. Он взаимодействует с Origin и Edge серверами следующим образом:
1. Поток публикуется на Origin сервер.
2. Transcoder забирает с Origin поток по запросу Edge сервера.
3. Transcoder транскодирует поток в соответствии с настройками, указанными Edge сервером.
4. Edge забирает с Transcoder поток для воспроизведения.
Конкретный узел для транскодирования выбирается при выборе маршрута для воспроизведения потока.
Для настройки транскодинга на Edge сервере используются профили. Файл профилей транскодинга cdn_profiles.yml
должен располагаться в каталоге /usr/local/FlashphonerWebCallServer/conf
:
profiles: -webrtc-144: audio: codec : opus rate : 48000 channels : 2 video: width : 256 height : 144 codecImpl : OPENH264 |
При запросе на воспроизведение потока, транскодированного по указанному профилю, имя профиля должно быть добавлено к имени потока, например
test-webrtc-144 |
Рекомендуется для удобства задавать имена профилей, начинающиеся с дефиса.
Для применения изменений в файле cdn_profiles.yml
необходим перезапуск сервера.
Параметр | Допустимые значения | Описание |
---|---|---|
Параметры аудио | ||
codec | opus mpeg4-generic speex | Используемый кодек аудио |
bitrate | Зависит от требуемого качества и пропускной способности каналов | Битрейт звука, бит/с |
rate | 8000 11025 12000 16000 22050 24000 32000 44100 48000 | Частота дискретизации звука |
channels | 1 2 | Количество каналов: моно или стерео |
Параметры видео | ||
codec | h264 vp8 | Используемый кодек видео |
bitrate | Зависит от требуемого качества и пропускной способности каналов | Битрейт видео, кбит/с |
width | Зависит от требуемого качества и пропускной способности каналов | Ширина картинки |
height | Зависит от требуемого качества и пропускной способности каналов | Высота картинки |
codeImpl | FF OPENH264 | Используемый кодек видео: на основе FFmpeg или OpenH.264 |
gop | Зависит от требуемого качества и пропускной способности каналов | Частота отправки ключевых кадров (GOP) |
fps | Зависит от требуемого качества и пропускной способности каналов | Частота кадров |
quality | Зависит от требуемого качества и пропускной способности каналов | Качество видео |
preset | ultrafast superfast veryfast faster fast medium slow slower veryslow placebo | Пресет FFmpeg, по умолчанию ultrafast |
profile | Зависит от требуемого качества | Профиль кодирования FFmpeg, по умолчанию Baseline |
level | Зависит от требуемого качества | Уровень кодирования FFmpeg, по умолчанию 3.1 |
Если ширина картинки не указана или равна 0, видео масштабируется по указанной высоте, с сохранением соотношения сторон.
Если ширина и высота картинки обе равны 0, видео масштабируется к разрешению 160x120.
При использовании FFmpeg можно выбрать предустановки (пресет) кодирования, профиль и уровень кодирования. Например, следующие параметры
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
Для управление профилями транскодинга на лету, без перезапуска сервера, служит специальное REST API
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
Здесь:
REST запросы необходимо отправлять на Edge сервер. Изменения в профилях сохраняются в памяти и применяются немедленно, а также записываются в файл cdn_profiles.yml
для использования после перезапуска сервера.
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | |
---|---|---|---|---|---|
/cdn/profile/add |
| 200 – OK 400 - Bad Request 409 - Conflict 500 – Internal Server Error | Добавить профиль транскодинга | ||
/cdn/profile/modify |
| 200 – OK 400 - Bad Request 404 - Not Found 500 – Internal Server Error | Изменить профиль транскодинга | ||
/cdn/profile/print |
| 200 – OK 404 - Not Found 500 – Internal Server Error | Получить список профилей транскодирования | ||
/cdn/profile/remove |
| 200 – OK 404 - Not Found 500 – Internal Server Error | Удалить профиль транскодирования |
Имя параметра | Описание | Пример |
---|---|---|
name | Имя профиля | -profile1 |
profile | Параметры профиля | { |
Параметры профиля обязательно должны содержать разделы audio
или video
.
Основными параметрами профиля являются следующие:
Если какие-либо из этих параметров не указаны при создании профиля, они будут добавлены в профиль со значением 0 для числовых и "" для строковых параметров, при этом будут применены значения по умолчанию.
Остальные параметры являются дополнительными и могут отсутствовать в профиле:
При изменении профиля изменяются только переданные параметры. Для сброса какого-либо из основных параметров к значению по умолчанию, либо для удаления из профиля дополнительного параметра необходимо передать -1, например:
{ "name": "-profile1", "profile": { "video": { "bitrate": -1, "codecImpl": -1 } } } |
Если по профилю в данный момент воспроизводится поток, изменение профиля возможно только после окончания воспроизведения потока и остановки агента, т.е. приблизительно через минуту после того, как от потока отключился последний подписчик.
Транскодинг потока на Edge сервере включается в следующих случаях:
1. Если приоритет видео кодека в настройках сервера выше, чем видео кодека, указанного в настройках профиля транскодирования. Например, при использовании профиля
-opus-vp8: audio: codec : opus rate : 48000 channels : 2 video: width : 320 height : 240 gop : 60 fps : 30 codec : vp8 codecImpl : FF |
и настройки Edge сервера
codecs=opus,...,h264,vp8,flv,mpv |
VP8 поток будет транскодирован в H264, поскольку приоритет данного кодека выше.
2. Если аудио кодека или частоты дискретизации, указанных в настройках профиля, нет в SDP подписчика, аудио дорожка будет транскодирована в один из форматов, поддерживаемых подписчиком.
Если на всех узлах CDN включено сохранение соотношения сторон при транскодировании (по умолчанию), то при транскодировании потока на Transcoder узле также будет сохранено исходное соотношение сторон, с которым этот поток был опубликован на Oriigin. Например, если к потоку 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).
В этом случае можно не указывать ширину кадра в профиле транскодирования, поскольку ширина будет выбрана, исходя из соотношения сторон. Например, допускается такой профиль
profile3: audio: codec : opus rate : 48000 video: height : 180 |
Маршруты в CDN строятся на основе периодических рассылок следующих данных:
Маршрут для воспроизведения потока на Edge сервере выбирается следующим образом:
1. Если на 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
2. Если на Edge сервере не настроен профиль транскодирования, Edge забирает поток с Origin
Здесь
Для получения информации о маршрутах используется REST API запрос /cdn/stream/show_routes
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
Здесь:
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | ||
---|---|---|---|---|---|---|
/cdn/stream/show_routes |
|
| 200 – OK 500 – Internal Server Error | Показать активные маршруты CDN |
Описание | Пример |
---|---|
Имя потока (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 из трех узлов:
На Origin публикуется WebRTC H264+opus (48 кГц, стерео) поток test
Воспроизводим поток test на Edge по профилю
-webrtc-opus-video-proxy: audio: codec : opus rate : 48000 channels : 2 video: codec: h264 |
В ответ на запрос
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes { "streamName": "test-webrtc-opus-video-proxy" } |
получаем:
1. Запрашиваемый профиль:
"REQUESTED-PROFILE": [ "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}" ], |
2. Поток захватывается с Origin:
"1-PROXY-PROFILE-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}" ], |
3. Поток может быть захвачен через Transcoder
"2-NEW-TRANSCODER-192.168.1.220": [], |
4. Но захвачен с Origin, поскольку параметры публикации потока совпадают с запрошенными параметрами воспроизведения:
"3-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}" ] |
Воспроизводим поток test на Edge по профилю
-webrtc-pcma-video-proxy: audio: codec : pcma rate : 8000 channels : 1 |
В ответ на запрос
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes { "streamName": "test-webrtc-pcma-video-proxy" } |
получаем:
1. Запрашиваемый профиль:
"REQUESTED-PROFILE": [ "AUDIO{bitrate=0, codec='pcma', rate=8000, channels=1}" ], |
2. На Transcoder создан профиль транскодирования:
"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}", "AUDIO{bitrate=0, codec='PCMA', rate=8000, channels=1}" ], |
3. Поток захватывается через 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='null', quality=null}", "AUDIO{bitrate=0, codec='PCMA', rate=8000, channels=1}" ], "3-NEW-TRANSCODER-192.168.1.220": [], |
4. Параметры публикации потока на Origin:
"3-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}" ] |
Воспроизводим поток test на Edge по профилю
-opus-vp8: audio: codec : opus rate : 48000 channels : 2 video: width : 320 height : 240 gop : 60 fps : 30 codec : vp8 codecImpl : FF |
В ответ на запрос
http://192.168.1.221:8081/rest-api/cdn/stream/show_routes { "streamName": "test-webrtc-opus-vp8" } |
получаем:
1. Запрашиваемый профиль:
"REQUESTED-PROFILE": [ "AUDIO{bitrate=0, codec='opus', rate=48000, channels=2}", "VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='vp8', codecImpl='FF', quality=null}" ], |
2. На Transcoder создан профиль транскодирования:
"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='', quality=null}", "VIDEO{width=320, height=240, gop=60, fps=30, bitrate=0, codec='VP8', codecImpl='FF', quality=null}" ], |
3. Поток захватывается через 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": [], |
4. Параметры публикации потока на Origin:
"3-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 входят несколько Transcoder узлов с одинаковыми профилями, нагрузка по таким узлам распределяется, исходя из загрузки процессора. Максимально допустимая загрузка конкретного Transcoder узла определяется настройкой
cdn_node_load_average_threshold=1.0 |
Эта величина задает соотношение между средней загрузкой процессора (параметр JVM SystemLoadAverage) и количеством процессорных ядер с учетом гипертрединга. Если значение превышено, Transcoder перестает участвовать в выборе маршрута для новых потоков и профилей. При этом в секции PROFILE данный узел отображается в маршрутах потока для тех профилей, по которым уже транскодируется этот поток.
Текущее состояние узла (участвует ли он в выборе маршрута для новых потоков) можно определить при помощи REST API. Узел в статусе NEW_STREAMS_ALLOWED может принимать новые потоки для транскодирования, узел в статусе GROUP_CONNECTION_ALLOWED может только отдавать потоки, которые на нем уже транскодируются.
Настройка должна задаваться на Transcoder узлах. Также эта настройка может задаваться на Origin узлах, в этом случае при помощи REST API можно контролировать загрузку Origin сервера и при достижении статуса GROUP_CONNECTION_ALLOWED публиковать потоки на другом Origin сервере.
При необходимости, на Transcoder узлах может быть ограничено максимальное количество одновременно используемых кодировщиков (encoders) видео при помощи настройки
cdn_transcoder_video_encoders_threshold=10000 |
При достижении этого количества, узел Transcoder переходит в статус GROUP_CONNECTION_ALLOWED. Учитываются все кодировщики на сервере, например, если один поток транскодируется по двум профилям, будет использовано 3 кодировщика, включая кодировщик PNG.
Настройка должна задаваться на Transcoder узлах
Для того, чтобы потоки по доступным Transcoder узлам распределялись равномерно, для транскодирования нового потока выбирается следующий свободный узел (алгоритм Round Robin). При этом, чтобы один и тот же опубликованный поток при одновременном запросе с нескольких клиентов не расходился по нескольким Transcoder узлам, предусмотрено кэширование по имени потока. Интервал времени кэширования задается в миллисекундах при помощи настройки
cdn_transcoder_for_new_connects_expire_ms=10000 |
В данном случае интервал кэширования составит 10 секунд.
Настройка должна задаваться на Transcoder узлах
Для того, чтобы Origin узлы не принимали на себя транскодинг, если все Transcoder узлы заняты, предусмотрена настройка
cdn_origin_allowed_to_transcode=false |
В данном случае (по умолчанию), если для транскодирования нового потока по указанному профилю нет доступных Transcoder узлов, поток не будет играться с ошибкой No available transcoders.
При необходимости, транскодирование на Origin серверах можно разрешить
cdn_origin_allowed_to_transcode=true |
Эта настройка должна задаваться на Edge узлах.
REST-запрос должен быть HTTP/HTTPS POST запросом в таком виде:
Здесь:
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание | |
---|---|---|---|---|---|
/cdn/show_nodes |
| 200 – OK 500 – Internal Server Error | Показать состояние узлов CDN | ||
/cdn/show_node_state |
| 200 – OK 500 – Internal Server Error | Показать состояние узла CDN, которому направлен запрос | ||
/cdn/enforce_node_state |
| 200 – OK 500 – Internal Server Error | Принудительно изменить состояние узла |
Имя параметра | Описание | Пример |
---|---|---|
globalState | Статус узла: ACTIVE или PASSIVE | ACTIVE |
id | Адрес узла | 192.168.1.64 |
processingState, state | Участвует ли узел в выборе маршрута для воспроизведения потоков: NEW_STREAMS_ALLOWED - участвует GROUP_CONNECTION_ALLOWED - не участвует | NEW_STREAMS_ALLOWED |
role | Роль узла: ORIGIN, TRANSCODER или EDGE | ORIGIN |
Запрос /cdn/show_nodes может быть направлен определенному узлу, в ответ узел вернет состояния всех видимых ему узлов CDN, кроме себя самого.
Запрос /cdn/enforce_node_state позволяет принудительно изменить состояние узла, например, вывести определенный транскодер из выбора маршрутов. Для сброса заданного состояния необходимо передать пустое тело запроса
POST /rest-api/cdn/enforce_state HTTP/1.1 Content-Length: 4 Content-Type: application/json {} |
Текущее состояние узла определяется следующим образом в порядке приоритета:
1. Если есть значение, заданное принудительно при помощи запроса /cdn/enforce_node_state, то выбирается это значение.
2. Если достигнуто ограничение по нагрузке процессора, то выбирается состояние GROUP_CONNECTIONS_ALLOWED.
3. Если достигнуто ограничение по кодировщикам видео, то выбирается состояние GROUP_CONNECTIONS_ALLOWED.
4. Если ограничения не достигнуты, то выбирается состояние NEW_STREAMS_ALLOWED.
Узел рассылает свое состояние другим узлам с периодичностью, заданной в миллисекундах при помощи настройки
cdn_nodes_state_refresh_interval=60000 |
По умолчанию, периодичность рассылки составляет 60 секунд. Для Transcoder узлов рекомендуется уменьшить это значение до 1 секунды, чтобы своевременно распределять потоки на другие узлы.
Авторизация узлов, которые пытаются подключиться к CDN, производится по IP-адресу. Адреса узлов, которые могут войти в CDN, должны быть указаны в следующей настройке
cdn_allowed_ips=192.168.1.39, 192.168.100.64, 192.168.101.65 |
Также в этой настройке могут быть указаны маски адресов, например
cdn_allowed_ips=192.168.1.39, 192.168.100.0/24 |
Каждый узел CDN, на котором указана данная настройка, будет принимать соединения только от тех узлов, чьи адреса совпадают с перечисленными либо подходят под указанные маски. Соединения с прочими узлами будут отвергнуты.
Обратная совместимость CDN 2.1 с CDN 2.0 поддерживается для следующих случаев:
1. Edge 2.0 может забирать потоки с Origin 2.1
2. Edge 2.1 может забирать потоки с Origin 2.0
При этом транскодинг работает согласно настройке кодеков и SDP по принципам, определенным для CDN 2.0.
1. Не рекомендуется публиковать поток с одним и тем же именем на двух Origin серверах одной CDN
2. Поток, опубликованный на одном из Origin серверов, следует забирать с этого же Origin или Edge сервера (в том числе через Transcoder сервер), но не с другого Origin сервера в той же CDN.
1. При использовании кодировщика на базе FFmpeg в первых кадрах транскодированного потока могут быть искажения (макроблоки)
Симптомы: при использовании профилей транскодинга в первых кадрах потока зритель видит макроблоки
Решение:
а) указать в профиле параметр quality
profiles: -240p: audio: codec : opus rate : 48000 video: height : 240 gop : 50 fps : 25 codec : h264 preset : veryfast quality : 25 codecImpl : FF |
б) если необходимо удерживать при транскодинге заданное значение битрейта видео, использовать кодировщик на базе OpenH264
profiles: -240p: audio: codec : opus rate : 48000 video: height : 240 bitrate : 400 gop : 50 fps : 25 codec : h264 codecImpl : OPENH264 |