Медиасервер предназначен для прокcирования речевой и видео информации по протоколу RTP, организации конференций, записи разговоров, воспроизведения медиафайлов и различных комбинаций этих режимов.
Управление ресурсами медиасервера осуществляется с помощью механизма control channel (RFC 6230 Media Control Channel Framework, RFC 6231 IVR Control Package, RFC 6505 Mixer Control Package).
Для настройки медиасервера выполните следующие шаги:
Установка программного медиасервера производится из репозитория ECSS-10, пакет ecss-media-server.
Перед установкой рекомендуется удалить старые версии медиасервера вместе с конфигурацией, если они были установлены ранее:
Например:
sudo aptitude purge ecss-media-server |
Для установки в консоли ОС Linux необходимо выполнить команду:
sudo aptitude update sudo aptitude install ecss-media-server |
В ходе установки необходимо будет ответить на ряд вопросов для формирования конфигурационного файла. Можно вводить ответы по умолчанию, тогда нужно будет вручную править файл /etc/ecss/ecss-media-server/config.xml. Описание параметров приведено на странице Настройка конфигурационного файла MSR.
Также возможно заранее перед установкой подготовить обычный текстовый файл ответов.
|
Далее внести изменения в debconf командой:
sudo debconf-set-selections <имя файла ответов> |
И после этого уже ставить пакет. Вопросов задаваться не будет
Конфигурационный XML-файл после установки медиасервера находится по пути /etc/ecss/ecss-media-server/config.xml.
где
|
|
Переопределять настройки конфигурационных файлов можно в каталогах:
Подробнее о запуске нескольких экземпляров — ниже, в разделе "Запуск медиасервера"
Для этого создаются конфигурационные файлы, которые читаются в алфавитном порядке, например:
<!-- 01-ecss-conf.xml -->
<?xml version="1.0" encoding="utf-8"?>
<config>
<general log-level="666" />
<accounts>
<dynamic msr_name="some name" realm="sip:x.x.x.x:zzzz"
dtmf_mode="rfc+inband+info" auth_name="user1" auth_password="password123"/>
</accounts>
</config>
<!-- 02-ecss-conf.xml -->
<?xml version="1.0" encoding="utf-8"?>
<config>
<rtp>
<auto name="1.1.1.1"/>
</rtp>
</config> |
В результате должен переопределиться уровень логгирования и добавится аккаунт, а также включена опция подмены ip в sdp.
Для работы сервис использует конфигурацию из файла
/etc/ecss/ecss-media-server/config.xml |
Подробнее о настройках — в разделе "Настройка конфигурационного файла MSR".
При изменении конфигурации необходимо обязательно перезапустить сервис ecss-media-server
Запуск сервиса:
sudo systemctl start ecss-media-server.service |
Остановка сервиса:
sudo systemctl stop ecss-media-server.service |
Перезапуск сервиса:
sudo systemctl restart ecss-media-server.service |
Описание опций команды ecss-media-server [options]
[options] — опция команды ecss-media-server, принимает значения:
Пример:
ecss-media-server --config=/home/ssw/config.xml |
В состав deb пакета ecss-media-server был добавлен сервис 'ecss-media-server@', который позволяет запускать мн-во экземпляров медиасервера.
Так же, для медиасервера был добавлен предсконфигурированный файл конфигурации(с выключенной поддержкой видео) с именем config-without-video.xml.
После установки deb пакета располагается по пути: /etc/ecss/ecss-media-server. Хотя данный файл предсконфигурирован, но для каждого конкретного случая его нужно донастраивать/перенастраивать:
| Отдельно нужно обратить внимание на секцию media, параметры port-start и port-range не должны пересекаться с параметрами уже запущенных msr-ов, иначе в ходе работы на одном из msr-ов могут возникнуть ошибки, в виду того, что данные порты уже будут заняты. Так же стоит обратить внимание на секцию mcc, параметр port так же не должен пересекается с параметрами уже запущенных msr-ов по той же причине. |
Для каждого нового экземпляра медиасервера, который будет развернут на хосте, требуется использовать свой файл конфигурации медиасервера.
|
| Отдельно нужно обратить внимание на секцию media, параметры port-start и port-range не должны пересекаться с параметрами уже запущенных msr-ов, иначе в ходе работы на одном из msr-ов могут возникнуть ошибки, в виду того, что данные порты уже будут заняты. Так же стоит обратить внимание на секцию mcc, параметр port так же не должен пересекается с параметрами уже запущенных msr-ов по той же причине. Параметр log-path должен быть уникальным для каждого MSR. Если путь указанный в log-path еще не существует, оператор SSW должен прописать его вручную (пользователь для директории с логами должен быть ssw:ssw). |
В systemd есть возможность запускать множество экземпляров сервиса, но предварительно данные экземпляры нужно включить.
Включение:
sudo systemctl enable ecss-media-server@<имя_запускаемого_экземпляра>
Запуск:
sudo systemctl start ecss-media-server@<имя_запускаемого_экземпляра>
В данном случае, этому медиасерверу будет соответствовать файл конфигурации с именем config-<имя_запускамого_экземпляра>.xml располагаемый по пути: /etc/ecss/ecss-media-server/
Например, включенному и запущенному экземпляру msr-а с именем without-video:
sudo systemctl enable ecss-media-server@without-video Created symlink /etc/systemd/system/multi-user.target.wants/ecss-media-server@without-video.service → /lib/systemd/system/ecss-media-server@.service. sudo systemctl start ecss-media-server@without-video |
будет соответствовать файл конфигурации с именем config-without-video.xml расположенный по пути: /etc/ecss/ecss-media-server/Для каждого экземпляра медиасервера должен быть сконфигурирован свой файл конфигурации медиасервера.
Убедиться, что экземпляр ecss-media-server@without-video запустился можно следующей командой:
ecss1@ssw 05:04:58 ~$ sudo systemctl status ecss-media-server@without-video
● ecss-media-server@without-video.service - daemon ecss-media-server-without/video of ecss-10
Loaded: loaded (/etc/systemd/system/ecss-media-server@.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-12-07 08:07:58 +07; 4s ago
Main PID: 12144 (ecss-media-serv)
Tasks: 19 (limit: 4915)
CGroup: /ecss.slice/ecss-media-server@without-video.service
└─12144 /usr/bin/ecss-media-server --config=/etc/ecss/ecss-media-server/config-without-video.xml --noinput
дек 07 08:07:58 ssw systemd[1]: Started daemon ecss-media-server-without/video of ecss-10.
дек 07 08:07:59 ssw ecss-media-server[8867]: WARNING: no real random source present! |
Распределенность медиасервера обеспечивает следующие возможности:
Для функционирования схемы система ECSS-10 должна обладать информацией о доступных ей медиасерверах и их возможностях. Механизм медиасерверов, используемых для обнаружения, должен быть динамическим, автоматически подстраиваться к изменениям параметров сети, реагировать на появление/исчезновение медиасервера/ECSS-10.
Используемая схема обнаружения и информирования о статусе/возможностях медиасерверов основана на стандартной SIP-регистрации (метод SIP REGISTER). В данном сообщении в ядро ECSS-10 передается вся необходимая служебная информация.
Согласно типовой схемы, подключения к ECSS-10 осуществляется в разных VLAN. Задача ECSS-10 обеспечить коммутацию медиапотоков между абонентами этих VLAN. Для коммутации медиапотоков между абонентами одного VLAN терминация трафика на медиаресурсе ECSS-10 (медиасервере) не является обязательной. Для абонентов разных VLAN необходимо:
На рисунке 1 указаны требования к функционалу медиасервера по формированию точки приема медиатрафика во всех VLAN, которые заведены на него.

Рисунок 1
Типовой случай распределенного медиасервера будет выглядеть следующим образом:

Рисунок 2
ECSS-10 должен корректно выбирать медиасервер. Под корректностью подразумевается уровень его загруженности (равномерное использование доступных ресурсов), а так же учет его территориального расположения (распределение с учетом географии пользователей). Уровень загрузки ресурсов вычисляется на основании данных о параметрах медиасервера (сообщение уровня загрузки CPU в каждом сообщении от MSR к SIP-серверу).
Территориальную принадлежность ECSS-10 определяет самостоятельно путем тегирования аккаунтов UA медиасервера. Служебным UA для медиасервера ставится в соответствие имя сайта (site) — географическая зона, которую может обслуживать данный контакт медиасервера. Пользовательским окончаниям и транкам так же задается географическая областью путем установки параметра site. Для проключения медиа-потока ECSS-10 использует медиасервер с сайтом минимально удаленным от целевого.
Сетка взаимопритяжений/дистанций (матрица связности) сайтов задается в конфигурации ECSS-10.
Матрица связности показывает расстояние между сайтами в условных единицах. Чем меньше расстояние, тем сайты ближе. Близость сайтов задает предпочтения по использованию медиаресурсов сайта для обслуживания вызова.
| Пример Вызов инициируется абонентом site1. Для обслуживания вызова система по матрице связности ищет медиаресурсы с минимальным расстоянием от сайта инициатора вызова. Значения показывающие "расстояние" между сайтами являются условными и фактически задают стоимость использования медиаресурса выбранного сайта для обслуживания вызова от абонента. Расстояние до медиаресурсов сайта, к которому относится абонент по умолчанию, принимается равным 0, но может быть изменено. Это сделано для того, чтобы можно было на время вывести MSR из работы, например, для обновления. Если установлено расстояние между сайтами 0 — это означает, что медиаресурсы сайтов равноправны. Если абонентам одного сайта необходимо запретить использовать медиаресурса другого сайта, то необходимо установить расстояние между этими сайтами равное бесконечности — infinity. |
Алгорим который использует ядро для поиска подходящего MSR эквивалентен следующему:
Далее выбранные контакты ранжируются по расстоянию между site UA и site самого контакта в соответствии с матрицей связанности:
admin@[restfs1@IBM]:/$ system/media/site/matrix ┌───────────┬───┬────┬────┬────┬───┐ │ Site-name │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────┼───┼────┼────┼────┼───┤ │ local │ 1 │ 0 │ 10 │ 20 │ │ │ site_102 │ 2 │ 10 │ │ │ │ │ site_103 │ 3 │ 20 │ │ │ │ │ site_104 │ 4 │ │ │ │ 0 │ └───────────┴───┴────┴────┴────┴───┘ Legend: empty distance - infinity distance between sites. [exec at: 02.08.2017 12:19:55, exec time: 19ms, nodes: core2@IBM] |
Выбираются контакты с наименьшим расстоянием;
Для контакта выставляем нижнюю границу(con_bottom_bound) по формуле:
con_bottom_bound = table_upper_bound |
Для контакта формируем верхнюю границу(con_upper_bound) по формуле:
(100 - con_msr_load) * con_msr_performance_coefficient |
Выставляем верхнюю границу таблицы(table_upper_bound) по формуле:
table_upper_bound = table_upper_bound + con_upper_bound |
Пример с 5 шага:
Шаг 5: Есть контакты con_1@msr_1, con_2@msr_1, con_1@msr_2, con_1@msr_3. Шаг 6: Есть контакты con_1@msr_1, con_1@msr_2, con_1@msr_3. msr_1 загружен на 55%, коэф. производительности 1.0. msr_2 загружен на 40%, коэф. производительности 0.9. msr_3 загружен на 60%, коэф. производительности 1.2. Шаг 6.1 table_upper_bound = 0, queue = [con_1@msr_1, con_1@msr_2, con_1@msr3] Шаг 6.2 take from queue = con_1@msr_1 Шаг 6.2.1 con_bottom_bound = 0 Шаг 6.2.2 con_upper_bound = (100 - 55) * 1.0 = 45 Шаг 6.2.3 table_upper_bound = 0 + 45 = 45 Шаг 6.2.4 put to list = con_1@msr_1(0-45) Шаг 6.3 переход на шаг 4.2 Шаг 6.2 take from queue = con_1@msr_2 Шаг 6.2.1 con_bottom_bound = 45 Шаг 6.2.2 con_upper_bound = (100 - 40) * 0.9 = 56 Шаг 6.2.3 table_upper_bound = 45 + 56 = 101 Шаг 6.2.4 put to list = con_1@msr_2(45-101) Шаг 6.2 take from queue = con_1@msr_3 Шаг 6.3 переход на шаг 6.2 Шаг 6.2.1 con_bottom_bound = 101 Шаг 6.2.2 con_upper_bound = (100 - 60) * 1.2 = 48 Шаг 6.2.3 table_upper_bound = 101 + 48 = 149 Шаг 6.2.4 put to list = con_1@msr_3(101-149) Шаг 6.4 list = [con_1@msr_1(0-45), con_1@msr_2(45-101), con_1@msr_3(101-149)] generate 58 Шаг 6.5 found con_1@msr_2(45-101) |
Найден контакт con_1@msr_2 (msr c именем msr_2).
MSR регистрируют контакты со следующими параметрами:
| name | zone | site | msr_id |
| msr1_eth0 | rtk | r_kalininsky | 1 |
| msr1_eth1 | mts | r_kalininsky | 1 |
| msr2_eth0 | rtk | r_sovetsky | 2 |
| msr2_eth1 | mts | r_sovetsky | 2 |
| msr3_eth0 | rtk | r_kirovsky | 3 |
| msr3_eth1 | mts | r_kirovsky | 3 |
Имеющаяся следующую матрицу связности:
| Site-name | d | 1 | 2 | 3 | 4 | 5 | 6 |
| r_kalininsky | 1 | 0 | |||||
| r_sovetsky | 2 | 0 | |||||
| r_kirovsky | 3 | 0 | |||||
| okrujnaya | 4 | 1 | 3 | 2 | 0 | ||
| molodeji | 5 | 3 | 1 | 2 | 0 | ||
| titova | 6 | 2 | 2 | 1 | 0 |
Абонент UA1 хочет установить разговор с абонентом UA2, при этом они имеют следующие параметры:
| UA | zone | site |
| ua1 | rtk | okrujnaya |
| ua2 | mts | molodeji |
Сначала паркуется плечо UA1.
Из списка активных контактов MSR выбираем все, которые принадлежат зоне rtk:
| name | zone | site | msr_id |
| msr1_eth0 | rtk | r_kalininsky | 1 |
| msr2_eth0 | rtk | r_sovetsky | 2 |
| msr3_eth0 | rtk | r_kirovsky | 3 |
Список контактов остается прежним.
Вычисляем расстояние между ua site: okrujnaya и сайтом каждого из контактов. Имеем:
| distance | name | zone | site | msr_id |
| 1 | msr1_eth0 | rtk | r_kalininsky | 1 |
| 2 | msr3_eth0 | rtk | r_kirovsky | 3 |
| 3 | msr2_eth0 | rtk | r_sovetsky | 2 |
Контакты ранжированы в порядке увеличения дистанции. Берем первый из них и используем его для парковки UA1:
name: msr1_eth0, msr_id:1
Парковка второго плеча: ua2.
Он принадлежит другой зоне, поэтому список контактов после выбора по зоне будет выглядеть так:
| name | zone | site | msr_id |
| msr1_eth1 | mts | r_kalininsky | 1 |
| msr2_eth1 | mts | r_sovetsky | 2 |
| msr3_eth1 | mts | r_kirovsky | 3 |
На предыдущем шаге у нас определен msr_id=1.
С учетом msr_id получаем новый список контактов:
| name | zone | site | msr_id |
| msr1_eth1 | mts | r_kalininsky | 1 |
Далее вычисляем расстояние между ua2 site: molodeju и r_kalininsky.
| distance | name | zone | site | msr_id |
| 1 | msr1_eth1 | mts | r_kalininsky | 1 |
В текущем примере используется довольно простая схема с MSR, поэтому для представленных условий у нас остался лишь один контакт.
Его и используем для парковки ua2.
Так как оба плеча сумели запарковаться на MSR, абоненты смогут обмениваться rtp трафиком.
Данный пример довольно простой и не иллюстрирует все способы применения заложенных возможностей и функций.
Однако базовые принципы показаны верно и их дальнейшая модификация позволит выстраивать весьма сложные схемы с территориальным тяготением голосового трафика.
Для каждого медиасервера в системе можно установить нужный коэффициент производительности. При распределении медиатрафика этот коэффициент будет учитываться и нагрузка между разными медиасерверами будет делиться пропорционально данным значениям. Коэффициент(любое положительное целое или дробное число) устанавливается командой system/media/msr/set.
Примеры:
Установить для msr_1 коэффициент производительности 2
system/media/msr/set msr_1 performance_coefficient 2 msr msr_1 set performance_coefficient from 1.0 to 2 [exec at: 21.07.2019 21:37:08, exec time: 102ms, nodes: core1@ecss1] |
Просмотр:
admin@mycelium1@ecss1:/$ system/media/msr/list Auto declared media server list specific: ┌───────┬─────────────┐ │ Name │ Performance │ │ │ coefficient │ ├───────┼─────────────┤ │ msr_1 │ 2.0 │ │ msr_2 │ 1.0 │ └───────┴─────────────┘ [exec at: 21.07.2019 21:37:12, exec time: 11ms, nodes: core1@ecss1] |
Также данные значения можно увидеть при выводе списка медиаресурсов:
admin@mycelium1@ecss1:/$ system/media/resource/list active Active media resource selected list specific: ┌─────────────┬───────┬────────────┬───────────┬──────┬────────┬───────────┬────────────┬───────────────────┬─────────┬──────────────┬────────┬─────────┬───────┬───────────────┬────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼────────────┼───────────┼──────┼────────┼───────────┼────────────┼───────────────────┼─────────┼──────────────┼────────┼─────────┼───────┼───────────────┼────────────┼─────────┤ │ core1@ecss1 │ msr_1 │ 3.14.0.156 │ 2.0 │ 0 │ 22abcd │ connected │ 1 12:01:16 │ 192.168.2.21:5700 │ bond1.2 │ 192.168.2.21 │ true │ default │ local │ bond1.2@msr_1 │ registered │ 58 │ │ │ msr_2 │ 3.14.0.156 │ 1.0 │ 0 │ c5b9d8 │ connected │ 12:01:10 │ 192.168.2.22:5700 │ bond1.2 │ 192.168.2.22 │ true │ default │ local │ bond1.2@msr_2 │ registered │ 57 │ └─────────────┴───────┴────────────┴───────────┴──────┴────────┴───────────┴────────────┴───────────────────┴─────────┴──────────────┴────────┴─────────┴───────┴───────────────┴────────────┴─────────┘ [exec at: 21.07.2019 21:51:27, exec time: 13ms, nodes: core1@ecss1] |
Механизм информирования ядра о степени загруженности MSR реализован через подписки. Команды по управлению такими подписками приведены справочнике команд CLI — /system/media/msr/subscription/.
По умолчанию в качестве источника видео при парковке медии на msr используется статическая картинка. В конфигурационном файле медиасервера этот параметр настраивается в секции media:
dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" |
Для создания собственной статической или видео-заставки можно использовать утилиты ffmpeg и gstreamer
Пакеты имеются в репозитории Ubuntu
sudo aptitude update sudo aptitude install ffmpeg sudo aptitude install gstreamer0.10-tools gstreamer0.10-plugins-base gstreamer0.10-plugins-good sudo add-apt-repository ppa:mc3man/gstffmpeg-keep sudo aptitude update sudo aptitude install gstreamer0.10-ffmpeg |
Статическая картинка
Изображение должно быть в формате YUV420(цветовая модель сырого кадра видео) и иметь расширение *.yuv. Размер до 1280x720, но лучше использовать меньшие размеры, например 352х288 или 704х576.
Пример конвертации:
bsk@bsk:~/doc/ssw/3.14$ ffmpeg -i input.png -f rawvideo -pix_fmt yuv420p output.yuv
ffmpeg version 2.8.15-0ubuntu0.16.04.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 20160609
configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
Input #0, png_pipe, from 'input.png':
Duration: N/A, bitrate: N/A
Stream #0:0: Video: png, rgb24(pc), 816x460 [SAR 3779:3779 DAR 204:115], 25 tbr, 25 tbn, 25 tbc
Output #0, rawvideo, to 'output.yuv':
Metadata:
encoder : Lavf56.40.101
Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 816x460 [SAR 1:1 DAR 204:115], q=2-31, 200 kb/s, 25 fps, 25 tbn, 25 tbc
Metadata:
encoder : Lavc56.60.100 rawvideo
Stream mapping:
Stream #0:0 -> #0:0 (png (native) -> rawvideo (native))
Press [q] to stop, [?] for help
frame= 1 fps=0.0 q=-0.0 Lsize= 550kB time=00:00:00.04 bitrate=112608.0kbits/s
video:550kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000% |
Видео-заставка
Видеофайл также должен быть в "сыром" YUV420 формате и иметь расширение .video
Пример конвертации:
bsk@bsk:~/doc/ssw/3.14$ gst-launch-0.10 -v filesrc location=./input_video.mp4 ! qtdemux name=demux demux.video_00 ! ffdec_h264 ! \ > video/x-raw-yuv,width=1280,height=720,format='(fourcc)'I420 ! \ > videoscale method=3 ! video/x-raw-yuv,width=720,height=480,format='(fourcc)'I420 ! \ > videorate max-rate=15 ! filesink location=./output.video Установка конвейера в состояние PAUSED... Подготовка конвейера (PREROLL)... /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:sink: caps = video/x-h264, stream-format=(string)avc, alignment=(string)au, level=(string)3.1, profile=(string)high, codec_data=(buffer)0164001fffe1001f6764001fac2ca4014016ec054808080a000003000200000300793b42c5a24001000568eb735250, width=(int)1280, height=(int)720, framerate=(fraction)30/1, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:src: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:src: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:sink: caps = video/x-raw-yuv, width=(int)1280, height=(int)720, framerate=(fraction)30/1, format=(fourcc)I420, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:src: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)15/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:sink: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 /GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = video/x-raw-yuv, width=(int)720, height=(int)480, format=(fourcc)I420, framerate=(fraction)15/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)32/27 Конвейер подготовлен (PREROLLED)... Установка конвейера в состояние PLAYING... New clock: GstSystemClock Получен маркер EOS («конец потока») от элемента «pipeline0». Execution ended after 11407407262 ns. Установка конвейера в состояние PAUSED... Установка конвейера в состояние READY... /GstPipeline:pipeline0/GstFileSink:filesink0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstVideoRate:videorate0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstVideoScale:videoscale0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = NULL /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = NULL /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:src: caps = NULL /GstPipeline:pipeline0/ffdec_h264:ffdec_h2640.GstPad:sink: caps = NULL /GstPipeline:pipeline0/GstQTDemux:demux.GstPad:audio_00: caps = NULL /GstPipeline:pipeline0/GstQTDemux:demux.GstPad:video_00: caps = NULL Установка конвейера в состояние NULL... Освобождение конвейера... |
Готовые видеозаставки находятся в /var/lib/ecss/ecss-media-server.
Условия
Медиасервер установлен на том же сервере, что и SSW.
Используется один интерфейс — bond1.2, адрес 192.168.2.21.
Настройки
Конфигурационный файл для таких условий нужно привести в виду (нужно прописать адрес 192.168.2.21 вместо 127.0.0.1):
<?xml version="1.0" encoding="utf-8"?>
<config date="10:48:28 10.09.2019">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled"/>
<transport bind-addr="192.168.2.21" port="5040" transport="udp+tcp"/>
<media mixer-clock-rate="48000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="1024" tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" opus="1" g7221="1" g729="0" speex="0" l16="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<dynamic msr_name="msr_1" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
</accounts>
<pbyte>
<mcc bind-addr="192.168.2.21" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
</config> |
В настройках ECSS-10 нужно указать адрес для приема регистраций (в целях безопасности, т.к. по умолчанию соединения принимаются на всех адресах — 0.0.0.0):
support@[mycelium1@ecss1]:/$ system/media/registrar/set private core1@ecss1 listen-ip 192.168.2.21 Private parameter listen-ip set to 192.168.2.21 at node core1@ecss1. |
Далее следует задекларировать медиаресурсы на интерфейсе bond1.2
support@[mycelium1@ecss1]:/$ system/media/resource/declare core1@ecss1 iface msr_1 bond1.2 default local true |
Медиасервер, в целях резервирования медиаресурсов, должен быть установлен на каждом сервере, на котором установлено ECSS-10.
Условия
Сервер 1. Интерфейс — eth0, адрес 192.168.2.21
Сервер 2. Интерфейс — eth0, адрес 192.168.2.22
| Не используйте плавающие (keepalive) адреса для медиасервера. |
Настройки
На первом сервере в конфигурационном файле /etc/ecss/ecss-media-server/config.xml в качестве адреса transport bind-addr и mcc bind-addr нужно указать адрес этого же сервера, т.е. 192.168.1.1. В секции аккаунтов должны быть прописаны динамические аккаунты для первого сервера и для второго.
<?xml version="1.0" encoding="utf-8"?>
<config date="10:48:28 10.09.2019">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled"/>
<transport bind-addr="192.168.2.21" port="5040" transport="udp+tcp"/>
<media mixer-clock-rate="48000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="1024" tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" opus="1" g7221="1" g729="0" speex="0" l16="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<dynamic msr_name="msr_1" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
<dynamic msr_name="msr_1" realm="sip:192.168.2.22:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
</accounts>
<pbyte>
<mcc bind-addr="192.168.2.21" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
</config |
На втором сервере адрес transport bind-addr и mcc bind-addr нужно указать 192.168.2.22. В секции аккаунтов задать имя MSR отличное от того, которое было задано для первого сервера, т.к. фактически настраивается отдельный второй медиасервер.
Конфигурационный файл для второго сервера должен иметь вид:
<?xml version="1.0" encoding="utf-8"?>
<config date="10:48:28 10.09.2019">
<general log-level="3" log-rotate="yes" max-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled"/>
<transport bind-addr="192.168.2.22" port="5040" transport="udp+tcp"/>
<media mixer-clock-rate="48000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="1024" tias-in-sdp="no" thread-cnt="2" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="1280" video-enc-height="720"/>
<codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" opus="1" g7221="1" g729="0" speex="0" l16="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/>
<accounts>
<dynamic msr_name="msr_2" realm="sip:192.168.2.21:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
<dynamic msr_name="msr_2" realm="sip:192.168.2.22:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>
</accounts>
<pbyte>
<mcc bind-addr="192.168.2.22" port="5700"/>
</pbyte>
<conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
</config |
В настройках ECSS-100 нужно указать адрес для приема регистраций (в целях безопасности, т.к. по умолчанию соединения принимаются на всех адресах — 0.0.0.0). Для каждого сервера — свой:
support@[mycelium1@ecss1]:/$ system/media/registrar/set private core1@ecss1 listen-ip 192.168.2.21 Private parameter listen-ip set to 192.168.1.1 at node core1@ecss1. support@[mycelium1@ecss1]:/$ system/media/registrar/set private core1@ecss2 listen-ip 192.168.2.22 Private parameter listen-ip set to 192.168.1.2 at node core1@ecss2. |
Далее следует задекларировать медиаресурсы каждого медиасервера на каждой ноде каждого ядра. Т.е. первый медиасервер задекларировать на обоих серверах и второй медиасервер также задекларировать на обоих серверах.
Для этого выполняются следующие команды:
/system/media/resource/declare core1@ecss1 iface msr_1 bond1.2 default local true /system/media/resource/declare core1@ecss1 iface msr_2 bond1.2 default local true /system/media/resource/declare core1@ecss2 iface msr_1 bond1.2 default local true /system/media/resource/declare core1@ecss2 iface msr_2 bond1.2 default local true |
В результате должно появиться четыре записи ресурсов:
admin@mycelium1@ecss1:/$ system/media/resource/list Active media resource selected list specific: ┌─────────────┬───────┬────────────┬───────────┬──────┬────────┬───────────┬───────────┬───────────────────┬─────────┬──────────────┬────────┬─────────┬───────┬───────────────┬────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼────────────┼───────────┼──────┼────────┼───────────┼───────────┼───────────────────┼─────────┼──────────────┼────────┼─────────┼───────┼───────────────┼────────────┼─────────┤ │ core1@ecss1 │ msr_1 │ 3.14.0.235 │ 1.0 │ 0 │ 22abcd │ connected │ 03:24:08 │ 192.168.2.21:5700 │ bond1.2 │ 192.168.2.21 │ true │ default │ local │ bond1.2@msr_1 │ registered │ 75 │ │ │ msr_2 │ 3.14.0.235 │ 1.0 │ 0 │ c5b9d8 │ connected │ 03:01:11 │ 192.168.2.22:5700 │ bond1.2 │ 192.168.2.22 │ true │ default │ local │ bond1.2@msr_2 │ registered │ 72 │ │ core1@ecss2 │ msr_1 │ 3.14.0.235 │ 1.0 │ 0 │ 22abcd │ connected │ 03:24:08 │ 192.168.2.21:5700 │ bond1.2 │ 192.168.2.21 │ true │ default │ local │ bond1.2@msr_1 │ registered │ 73 │ │ │ msr_2 │ 3.14.0.235 │ 1.0 │ 0 │ c5b9d8 │ connected │ 03:01:11 │ 192.168.2.22:5700 │ bond1.2 │ 192.168.2.22 │ true │ default │ local │ bond1.2@msr_2 │ registered │ 72 │ └─────────────┴───────┴────────────┴───────────┴──────┴────────┴───────────┴───────────┴───────────────────┴─────────┴──────────────┴────────┴─────────┴───────┴───────────────┴────────────┴─────────┘ [exec at: 11.09.2019 16:42:50, exec time: 24ms, nodes: core1@ecss1 |
При остановке или перезапуске медиасервера, медиасервер предварительно завершает все активные sip сессии до ядер, отправляя BYE c полем Reason со значением SIP;cause=480;text="System Shutdown".
Каждое ядро, принимая данный BYE, понимает, что медиасервер остановили/перезапустили и инициирует процедуру перепарковки данного вызова на другой медиасервер.
Пример сообщения BYE:
BYE sip:core@192.168.23.3:5000 SIP/2.0 Via: SIP/2.0/UDP 127.0.0.1:5040;rport;branch=z9hG4bKPjtPrQHcWDEo-bflsWmwrMTCj.3PnfioVH Max-Forwards: 70 From: <sip:enp3s0@127.0.0.1>;tag=xxUS3tNZtP3VUn4z1Eld9Y.tVh-vg57B To: <sip:core@ecss10>;tag=asRx2P Call-ID: g2gEZAALdGVzdC5kb21haW5tAAAAEGYwNzkxM2I4NmMyNzZmMjFtAAAAEGYwNzkxM2JhMmM5ODhjMjhhAQ== CSeq: 23023 BYE User-Agent: Eltex media-server 3.10.0.5 Reason: SIP;cause=480;text="System Shutdown" Content-Length: 0 |
Условия
Система настроена для работы по примеру Системы с одним сервером.
Необходимо добавить интерфейс bond1.3 для обслуживания медиасервером.
Настройки
Декларируем медиаресурсы для нового интерфейса:
system/media/resource/declare core1@ecss1 by_iface msr_1 bond1.3 default local true |
Преимущества
Все вызовы на селектор/с селектора будут парковаться на отдельный медиасервер (медиасервер селекторных совещаний). Если вызов нельзя запарковать на медиасервер, то он будет отклонен.
Условия
Система настроена для работы по примеру Системы с одним сервером.
Настройки
Потребуется сайты для абонентов и для медиа-серверов.
Для абонентов требуются сайты:
Для медиа-серверов требуются site:
Декларируем перечисленные выше сайты через расширенный web или Cocon:
system/media/site/declare <site>
, в итоге имеет матрицу сайтов:
admin@[md1@IBM]:/$ system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ Site-name │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ │ │ │ tc │ 2 │ │ 0 │ │ │ │ video │ 3 │ │ │ 0 │ │ │ without-video │ 4 │ │ │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ Legend: empty distance — infinity distance between sites. [exec at: 06.03.2019 13:10:34, exec time: 13ms, nodes: core1@IBM] |
После этого настраиваем расстояния между сайтами расширенный web или Cocon:
system/media/site/distance <from site> <to site> <distance>
, чтобы матрица расстояний выглядела следующим образом:
admin@[md1@IBM]:/$ system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ Site-name │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ 5 │ 6 │ │ tc │ 2 │ │ 0 │ 10 │ 3 │ │ video │ 3 │ 5 │ 10 │ 0 │ │ │ without-video │ 4 │ 6 │ 3 │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ Legend: empty distance - infinity distance between sites. [exec at: 06.03.2019 13:12:16, exec time: 25ms, nodes: core1@IBM] |
Выставляем site в tc для системного интерфейса system:teleconference:
admin@[md1@IBM]:/$ domain/test.domain/iface/user-set * * system:teleconference site tc Property 'site' successfully changed to 'tc' for interfaces: system:teleconference [exec at: 06.03.2019 13:18:17, exec time: 25ms, nodes: ds1@IBM] |
Настраиваем конфигурационный файл для медиасервера селекторной связи:
/etc/ecss/ecss-media-server/config-without-video.xml |
Выставляем параметры port-start, port-range и port в секции mcc, таким образом, чтобы они не пересекались с параметрами уже запущенных медиасерверов.
Включаем медиасервер селекторных совещаний:
sudo systemctl enable ecss-media-server@without-video |
Запускаем медиасервер селекторных совещаний:
sudo systemctl start ecss-media-server@without-video |
Декларируем контакты медиа-сервера с видео с site равным video, пример:
admin@[md1@IBM]:/$ system/media/resource/declare * iface paul enp0s8 default video true Declared media resources ┌─────────────┬─────────────┬────────┬─────────┬───────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼─────────────┼────────┼─────────┼───────┤ │ core1@IBM │ enp0s8@paul │ true │ default │ video │ │ core2@IBM │ enp0s8@paul │ true │ default │ video │ │ core1@ecss1 │ enp0s8@paul │ true │ default │ video │ │ core1@ecss2 │ enp0s8@paul │ true │ default │ video │ │ core1@PAUL │ enp0s8@paul │ true │ default │ video │ │ core2@PAUL │ enp0s8@paul │ true │ default │ video │ └─────────────┴─────────────┴────────┴─────────┴───────┘ [exec at: 06.03.2019 13:22:08, exec time: 150ms, nodes: core1@IBM] |
Декларируем контакты медиа-сервера без видео с site равным without-video, пример:
admin@[md1@IBM]:/$ system/media/resource/declare * iface paul.without-video enp0s8 default without-video true Declared media resources ┌─────────────┬───────────────────────────┬────────┬─────────┬───────────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼───────────────────────────┼────────┼─────────┼───────────────┤ │ core1@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ └─────────────┴───────────────────────────┴────────┴─────────┴───────────────┘ [exec at: 06.03.2019 13:22:35, exec time: 119ms, nodes: core1@IBM] |
Если контакты уже были задекларированы, для контактов медиа-сервера с видео выставляем site в video, пример:
admin@[md1@IBM]:/$ system/media/resource/set * enp0s8@paul site video Media resource: ┌─────────────┬─────────────┬──────────┬───────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼─────────────┼──────────┼───────┤ │ core2@PAUL │ enp0s8@paul │ site │ video │ │ core1@PAUL │ enp0s8@paul │ site │ video │ │ core1@ecss2 │ enp0s8@paul │ site │ video │ │ core1@ecss1 │ enp0s8@paul │ site │ video │ │ core2@IBM │ enp0s8@paul │ site │ video │ │ core1@IBM │ enp0s8@paul │ site │ video │ └─────────────┴─────────────┴──────────┴───────┘ [exec at: 06.03.2019 13:28:05, exec time: 35ms, nodes: core1@IBM] |
а для контактов медиа-сервера без видео выставляем site в without-video, пример:
admin@[md1@IBM]:/$ system/media/resource/set * enp0s8@paul.without-video site without-video Media resource: ┌─────────────┬───────────────────────────┬──────────┬───────────────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼───────────────────────────┼──────────┼───────────────┤ │ core2@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ site │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ site │ without-video │ │ core1@IBM │ enp0s8@paul.without-video │ site │ without-video │ └─────────────┴───────────────────────────┴──────────┴───────────────┘ [exec at: 06.03.2019 13:28:24, exec time: 34ms, nodes: core1@IBM] |
Существует возможность перепарковывать селекторную связь на конкретный медиа-сервер использую только примитив site.
При парковке вызова, выбирается медиа-сервер до которого существует наименьшее расстояние от паркуемых абонентов(расстояние между от site-ов абонентов до site-ов медиа-серверов). Если находятся 2 и более одинаковых минимальных расстояний до медиа-сервером, то медиа-сервер выбирается равновероятно (на основании его загруженности и коэффициента производительности).
Преимущества
Настройка
В примере рассматривается система с использованием 3-x MSR. Количество MSR можно увеличить в зависимости от требований к системе.
Для абонентов требуются site:
Декларируем перечисленные выше site командой:
system/media/site/declare <site>
Ожидаемая матрица после декларации сайтов:
admin@[md1@IBM]:/$ system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ Site-name │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ │ │ │ tc │ 2 │ │ 0 │ │ │ │ video │ 3 │ │ │ 0 │ │ │ without-video │ 4 │ │ │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ Legend: empty distance - infinity distance between sites. [exec at: 06.03.2019 13:10:34, exec time: 13ms, nodes: core1@IBM] |
После этого настраиваем расстояния между сайтами командой:
system/media/site/distance <from site> <to site> <distance>
Ожидаемый результат настройки сайтов для данного примера:
admin@[md1@IBM]:/$ system/media/site/matrix ┌───────────────┬───┬───┬────┬────┬───┐ │ Site-name │ # │ 1 │ 2 │ 3 │ 4 │ ├───────────────┼───┼───┼────┼────┼───┤ │ local │ 1 │ 0 │ │ 5 │ 6 │ │ tc │ 2 │ │ 0 │ 10 │ 3 │ │ video │ 3 │ 5 │ 10 │ 0 │ │ │ without-video │ 4 │ 6 │ 3 │ │ 0 │ └───────────────┴───┴───┴────┴────┴───┘ Legend: empty distance - infinity distance between sites. [exec at: 06.03.2019 13:12:16, exec time: 25ms, nodes: core1@IBM] |
Задание таких расстояний преследовало следующие поведения:
Выставляем site в tc для системного интерфейса system:teleconference:
admin@[md1@IBM]:/$ domain/test.domain/iface/user-set * * system:teleconference site tc Property 'site' successfully changed to 'tc' for interfaces: system:teleconference [exec at: 06.03.2019 13:18:17, exec time: 25ms, nodes: ds1@IBM] |
Декларируем контакты медиа-сервера с видео с site равным video:
admin@[md1@IBM]:/$ system/media/resource/declare * iface paul enp0s8 default video true Declared media resources ┌─────────────┬─────────────┬────────┬─────────┬───────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼─────────────┼────────┼─────────┼───────┤ │ core1@IBM │ enp0s8@paul │ true │ default │ video │ │ core2@IBM │ enp0s8@paul │ true │ default │ video │ │ core1@ecss1 │ enp0s8@paul │ true │ default │ video │ │ core1@ecss2 │ enp0s8@paul │ true │ default │ video │ │ core1@PAUL │ enp0s8@paul │ true │ default │ video │ │ core2@PAUL │ enp0s8@paul │ true │ default │ video │ └─────────────┴─────────────┴────────┴─────────┴───────┘ [exec at: 06.03.2019 13:22:08, exec time: 150ms, nodes: core1@IBM] |
Декларируем контакты медиа-сервера без видео с site равным without-video:
admin@[md1@IBM]:/$ system/media/resource/declare * iface paul.without-video enp0s8 default without-video true Declared media resources ┌─────────────┬───────────────────────────┬────────┬─────────┬───────────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼───────────────────────────┼────────┼─────────┼───────────────┤ │ core1@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ │ core2@PAUL │ enp0s8@paul.without-video │ true │ default │ without-video │ └─────────────┴───────────────────────────┴────────┴─────────┴───────────────┘ [exec at: 06.03.2019 13:22:35, exec time: 119ms, nodes: core1@IBM] |
Если контакты уже были задекларированы, для контактов медиа-сервера с видео выставляем site в video:
admin@[md1@IBM]:/$ system/media/resource/set * enp0s8@paul site video Media resource: ┌─────────────┬─────────────┬──────────┬───────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼─────────────┼──────────┼───────┤ │ core2@PAUL │ enp0s8@paul │ site │ video │ │ core1@PAUL │ enp0s8@paul │ site │ video │ │ core1@ecss2 │ enp0s8@paul │ site │ video │ │ core1@ecss1 │ enp0s8@paul │ site │ video │ │ core2@IBM │ enp0s8@paul │ site │ video │ │ core1@IBM │ enp0s8@paul │ site │ video │ └─────────────┴─────────────┴──────────┴───────┘ [exec at: 06.03.2019 13:28:05, exec time: 35ms, nodes: core1@IBM] |
Для контактов медиа-сервера без видео выставляем site в without-video:
admin@[md1@IBM]:/$ system/media/resource/set * enp0s8@paul.without-video site without-video Media resource: ┌─────────────┬───────────────────────────┬──────────┬───────────────┐ │ Node │ Contact │ Property │ Value │ ├─────────────┼───────────────────────────┼──────────┼───────────────┤ │ core2@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@PAUL │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss2 │ enp0s8@paul.without-video │ site │ without-video │ │ core1@ecss1 │ enp0s8@paul.without-video │ site │ without-video │ │ core2@IBM │ enp0s8@paul.without-video │ site │ without-video │ │ core1@IBM │ enp0s8@paul.without-video │ site │ without-video │ └─────────────┴───────────────────────────┴──────────┴───────────────┘ [exec at: 06.03.2019 13:28:24, exec time: 34ms, nodes: core1@IBM] |
Периодически на системе бывает так, что определенная группа абонентов софтсвича территориально удалена от сервером ECSS-10, и/или ограничена по ширине канала связи (выделенная локация). В этом случае, с целью оптимизации трафика, для разговора абонентов такой группы между собой есть смысл парковать их медию на отдельно стоящий MSR, который будет расположен на той же локации что и абоненты. При этом, если абонент данной локации разговаривает с абонентом "центра", то использоваться должен основной MSR. В данном разделе мы опишем пошаговую инструкцию по настройки данной схемы.
Рассмотрим пример. Есть софтсвич, стоящий в Москве, им пользуются vip-клиенты, локальные пользователи, а также существует возможность собирать телеконференции. Для каждого из этих типов пользователей имеется отдельный MSR. По умолчанию в системе создан site local, в котором по умолчанию создаются все абоненты ECSS-10.
| Пользователи | MSR |
|---|---|
| VIP | MSR.1 |
| LOCAL | MSR.2 |
| TC | MSR.3 |
Создание site-ов
Нужно создать site для абонента VIP и TC.
По умолчанию список site следующий:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/list List of all sites: local |
Создаем site для абонента VIP:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/declare vip Site: vip Created successfully. |
Создаем site для абонентов TC:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/declare tc Site: tc Created successfully. |
После изменений список site следующий:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/list List of all sites: local vip tc |
Настройка матрицы связности между site-ами
После создания site-ов, матрица связности между site-ами будет следующей:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/matrix ┌───────────┬───┬───┬───┬───┐ │ Site-name │ # │ 1 │ 2 │ 3 │ ├───────────┼───┼───┼───┼───┤ │ vip │ 1 │ 0 │ │ │ │ local │ 2 │ │ 0 │ │ │ tc │ 3 │ │ │ 0 │ └───────────┴───┴───┴───┴───┘ Legend: empty distance - infinity distance between sites. |
К MSR1 должен быть привязан site vip, к MSR2 local, к MSR3 tc.
Выставляем расстояние между абонентами VIP и медиа-сервером MSR.1, который также использует сайт VIP:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance vip vip 10 Distance between vip and vip changed to: 10. |
Выставляем расстояние между абонентами VIP и медиа-сервером MSR.2, который использует сайт LOCAL :
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance vip local 20 Distance between vip and local changed to: 20. |
Выставляем расстояние между абонентами VIP и медиа-сервером MSR.3, который использует сайт TC:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance vip tc 50 Distance between vip and tc changed to: 50. |
Выставляем расстояние между абонентами LOCAL и медиа-сервером MSR.1, который использует сайт VIP:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance local vip r Distance between local and vip changed to: r. |
Выставляем расстояние между абонентами LOCAL и медиа-сервером MSR.2, который использует сайт LOCAL:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance local local 10 Distance between local and local changed to: 10. |
Выставляем расстояние между абонентами LOCAL и медиа-сервером MSR.3, который использует сайт ТС:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance local tc 50 Distance between local and tc changed to: 50. |
Выставляем расстояние между TC и медиа-сервером MSR.3, который использует сайт ТС:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/site/distance tc tc 0 Distance between local and tc changed to: 0. |
После изменений, матрица связности следующая:
admin@[mycelium1@PAUL#ECSS-D 000001]:/$ system/media/site/matrix ┌───────┬───┬───┬────┬────┐ │ site │ # │ 1 │ 2 │ 3 │ ├───────┼───┼───┼────┼────┤ │ vip │ 1 │ 0 │ 20 │ 50 │ │ local │ 2 │ r │ 10 │ 50 │ │ tc │ 3 │ │ │ 0 │ └───────┴───┴───┴────┴────┘ |
Декларация ресурсом медиа-серверов
Пусть на ядре зарегистрированы 3 меда-сервера, MSR.1, MSR.2, MSR.3.
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/resource/list all All media resource selected list specific: ┌─────────────┬───────┬──────────┬───────────┬──────┬────────┬───────────┬───────────┬──────────────────────┬─────────────┬─────────────────┬────────┬─────────┬───────┬───────────────────┬──────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼──────────┼───────────┼──────┼────────┼───────────┼───────────┼──────────────────────┼─────────────┼─────────────────┼────────┼─────────┼───────┼───────────────────┼──────────────┼─────────┤ │ core1@ecss1 │ MSR.1 │ 3.14.5.5 │ 1.0 │ 0 │ 0b131b │ connected │ 01:28:59 │ 127.0.0.1:5700 │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.1 │ registered │ 119 │ │ │ │ │ │ │ │ │ │ │ eno4 │ 192.168.116.179 │ false │ │ │ eno4@MSR.1 │ registered │ 119 │ │ │ MSR.2 │ 3.14.5.5 │ 1.0 │ 0 │ 7a7740 │ connected │ 01:26:08 │ 10.24.40.53:5700 │ enp2s0 │ 192.168.116.181 │ false │ │ │ enp2s0@MSR.2 │ registered │ 170 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.2 │ registered │ 170 │ │ │ MSR.3 │ 3.14.5.5 │ 1.0 │ 0 │ f01fb6 │ connected │ 00:20:06 │ 192.168.116.131:5700 │ bond1 │ 192.168.116.131 │ false │ │ │ bond1@MSR.3 │ registered │ 173 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.3 │ registered │ 174 │ └─────────────┴───────┴──────────┴───────────┴──────┴────────┴───────────┴───────────┴──────────────────────┴─────────────┴─────────────────┴────────┴─────────┴───────┴───────────────────┴──────────────┴─────────┘ |
Декларируем ресурс медиа-сервера MSR.1 c site vip:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/resource/declare * iface MSR.1 eno4 default vip true Declared media resources ┌─────────────┬────────────┬────────┬─────────┬─────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼────────────┼────────┼─────────┼─────────┤ │ core1@IBM │ eno4@MSR.1 │ true │ default │ vip │ │ core2@IBM │ eno4@MSR.1 │ true │ default │ vip │ └─────────────┴────────────┴────────┴─────────┴─────────┘ |
Декларируем ресурс медиа-сервера MSR.2 c site local:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/resource/declare * iface MSR.2 enp2s0 default local true Declared media resources ┌─────────────┬──────────────┬────────┬─────────┬─────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼──────────────┼────────┼─────────┼─────────┤ │ core1@IBM │ enp2s0@MSR.2 │ true │ default │ local │ │ core2@IBM │ enp2s0@MSR.2 │ true │ default │ local │ └─────────────┴──────────────┴────────┴─────────┴─────────┘ |
Декларируем ресурс медиа-сервера MSR.3 c site tc:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/resource/declare * iface MSR.3 bond1 default tc true Declared media resources ┌─────────────┬──────────────┬────────┬─────────┬─────────┐ │ Node │ Contact │ Active │ Zone │ Site │ ├─────────────┼──────────────┼────────┼─────────┼─────────┤ │ core1@IBM │ bond1@MSR.3 │ true │ default │ tc │ │ core2@IBM │ bond1@MSR.3 │ true │ default │ tc │ └─────────────┴──────────────┴────────┴─────────┴─────────┘ |
После изменений список ресурсов следующий:
admin@[mycelium1@PAUL#ECSS-D-MECHANIC]:/$ system/media/resource/list all All media resource selected list specific: ┌─────────────┬───────┬──────────┬───────────┬──────┬────────┬───────────┬───────────┬──────────────────────┬─────────────┬─────────────────┬────────┬─────────┬───────┬───────────────────┬──────────────┬─────────┐ │ Node │ MSR │ MSR │ MSR │ MSR │ Cc-id │ Cc-status │ Cc-uptime │ Cc-address │ Iface │ Iface │ Active │ Zone │ Site │ Contact │ Status │ Expired │ │ │ │ version │ perf coef │ load │ │ │ │ │ name │ addr │ │ │ │ │ │ │ ├─────────────┼───────┼──────────┼───────────┼──────┼────────┼───────────┼───────────┼──────────────────────┼─────────────┼─────────────────┼────────┼─────────┼───────┼───────────────────┼──────────────┼─────────┤ │ core1@ecss1 │ MSR.1 │ 3.14.5.5 │ 1.0 │ 0 │ 0b131b │ connected │ 01:28:59 │ 127.0.0.1:5700 │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.1 │ registered │ 119 │ │ │ │ │ │ │ │ │ │ │ eno4 │ 192.168.116.179 │ true │default │vip │ eno4@MSR.1 │ registered │ 119 │ │ │ MSR.2 │ 3.14.5.5 │ 1.0 │ 0 │ 7a7740 │ connected │ 01:26:08 │ 10.24.40.53:5700 │ enp2s0 │ 192.168.116.181 │ true │default │local │ enp2s0@MSR.2 │ registered │ 170 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.2 │ registered │ 170 │ │ │ MSR.3 │ 3.14.5.5 │ 1.0 │ 0 │ f01fb6 │ connected │ 00:20:06 │ 192.168.116.131:5700 │ bond1 │ 192.168.116.131 │ true │default │tc │ bond1@MSR.3 │ registered │ 173 │ │ │ │ │ │ │ │ │ │ │ lo │ 127.0.0.1 │ false │ │ │ lo@MSR.3 │ registered │ 174 │ └─────────────┴───────┴──────────┴───────────┴──────┴────────┴───────────┴───────────┴──────────────────────┴─────────────┴─────────────────┴────────┴─────────┴───────┴───────────────────┴──────────────┴─────────┘ |
Выставление site-ов на абонентах
По умолчанию на абоненте site выставлен в local. Для того, чтобы абонента сделать абонентом VIP, нужно на абоненте выставить site в vip:
admin@[mycelium1@PAUL#ECSS-D 000001]:/$ domain/test.domain/iface/user-set * * 103@test.domain site vip Property 'site' successfully changed to 'vip' for interfaces: 103@test.domain |
Принцип распределения вызов
При выставлении на интерфейсе system:teleconference сайта tc, все конференции будут собираться через MSR.3. В случае его падения, конференции собираться не будут.
Звонки между VIP абонентами будут проходить через MSR.1, в случае его падения через MSR.2, если же и MSR.2 будет иметь несиправности, то вызовы пойдут через MSR.3
Локальные абоненты будут задействовать MSR.2, в случае его падения MSR.3.
Звонки между VIP и локальными абонентами будут осуществляться через MSR.1 и MSR.2.
В данном разделе приведены примеры того, как можно организовать multicast вещание со стороннего http-сервера на локальный multicast-адрес:
gst-launch-1.0 souphttpsrc location=http://us4.internet-radio.com:8258 ! decodebin ! audioconvert ! audioresample ! alawenc ! rtppcmapay min-ptime=20000000 max-ptime=20000000 ! udpsink host=224.224.224.1 port=5004 auto-multicast=true sync=false |
gst-launch-1.0 souphttpsrc location=http://us4.internet-radio.com:8258 ! decodebin ! audioconvert ! audioresample ! avenc_g722 ! rtpg722pay min-ptime=20000000 max-ptime=20000000 ! udpsink host=224.224.224.1 port=5004 auto-multicast=true sync=false |