Описание
Новая реализация CDN 2.1 отличается от CDN 2.0 дополнительными возможностями:
- разделение узлов CDN по географическому (EU, US) или другому признаку при помощи групп
- выделение узлов под задачи транскодинга, назначая таким узлам роль Transcoder
Группировка узлов CDN
Серверы в 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
Рекомендуется для удобства задавать имена профилей, начинающиеся с дефиса.
Параметры профиля
Параметр | Допустимые значения | Описание |
---|---|---|
Параметры аудио | ||
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 | Зависит от требуемого качества и пропускной способности каналов | Качество видео |
В каких случаях поток транскодируется на Edge сервере
Транскодинг потока на 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 строятся на основе периодических рассылок следующих данных:
- Origin рассылает узлам с ролью Transcoder и Edge информацию об опубликованных потоках;
- Transcoder рассылает узлам с ролью Edge в пределах той же группы информацию о потоках, которые уже захвачены им с Origin;
- Edge не рассылает ничего и всегда является конечной точкой маршрута.
Маршрут для воспроизведения потока на 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
Пример распределения потоков в CDN с использованием Transcoder узлов
Здесь
- stream1, stream2, stream3 - потоки. опубликованные на Origin
- stream1-P1 - поток stream1, транскодированный по профилю P1
- stream2-P1 - поток stream1, транскодированный по профилю P2
Получение информации о маршрутах с помощью 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-методы и статусы ответа
REST-метод | Пример тела REST-запроса | Пример тела REST-ответа | Статусы ответа | Описание |
---|---|---|---|---|
/cdn/stream/show_routes | { "streamName":"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}" ], "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}" ] } | 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 из трех узлов:
- 192.168.1.219 - Origin
- 192.168.1.220 - Transcoder
- 192.168.1.221 - Edge
На Origin публикуется WebRTC H264+opus (48 кГц, стерео) поток test
Воспроизведение потока с Origin без транскодинга при совпадении профилей публикации и воспроизведения
Воспроизводим поток 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}" ]
Воспроизведение потока с Transcoder с транскодингом звука
Воспроизводим поток 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}" ]
Воспроизведение потока с 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
В ответ на запрос
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
Авторизация узлов, которые пытаются подключиться к 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.0
Обратная совместимость 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.