Описание
Новая реализация 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 | Зависит от требуемого качества и пропускной способности каналов | Качество видео |
Если ширина картинки не указана или равна 0, видео масштабируется по указанной высоте, с сохранением соотношения сторон.
Если ширина и высота картинки обе равны 0, видео масштабируется к разрешению 160x120.
В каких случаях поток транскодируется на 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 включено сохранение соотношения сторон при транскодировании (по умолчанию), то при транскодировании потока на 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: width : 320
Авторизация узлов в 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.1/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.