Как известно, в природе существуют CDN-сети, которые используются для доставки потокового видео конечным пользователям. Взять к примеру онлайн-трансляцию футбольного матча. Исторически сложилось, что протокол RTMP, разработанный Adobe, в определенное время стал очень популярен для доставки Live-видеоконтента, и поддержка этого протокола есть в каждом уважающем себя Encoder–устройстве или программе, которая захватывает видеопоток с камеры и отправляет на сервер или CDN для последующей раздачи. В статье описывается как сделать SIP источником потока для CDN.
Способы дальнейшей доставки видео конечным пользователям зависят от конкретной CDN и используемых технлогий, которые позволяют отобразить поток на множестве устройств и платформ: Apple HTTP Live Streaming, RTSP, MPEG-DASH, WebRTC, Websockets, и т.д.
Также исторически сложилось, что протокол SIP (Session Initiation Protocol) известен в основном как протокол для аудиозвонков и телефонии и скорее всего по этой причине этот протокол не попал в зону интересов CDN-провайдеров и вендоров серверного программного обеспечения для CDN-сетей.
Хотя у многих SIP ассоциируется только с телефонией, протокол SIP изначально планировался и разрабатывался как универсальный протокол установки соединения для последующей передачи произвольных данных: аудио, видео, файлы, сообщения, и т.д. На сегодняшний день протокол совершенно не устарел и большое количество программного обеспечения и интернет-сервисов поддерживает SIP протокол в том или ином виде. В основном это ПО и оборудование связанное с видеоконференциями, видеочатами, коммуникациями.
В итоге на этом технологическом стыке: SIP и CDN появилась интеграционная задача по использованию SIP устройств или телекоммуникационного сервиса, как источника видеопотока для CDN сети с последующей раздачей этого видеопотока конечным пользователям.
Самым простым примером может послужить видеоконференция или вебинар образовательной или публичной тематики, развернутый на базе программного обеспечения с поддержкой SIP и требующий трансляции в CDN сеть для широкого представления события.
В данной статье мы для простоты ограничимся захватом аудио потока с SIP-конференции и дальнейшей трансляцией этого потока по протоколу RTMP. Строго говоря, такое действие является скорее SIP-вызовом с дальнейшей переконвертацией и перенаправлением трафика нежели захватом видео.
На схеме захвата и трансляции видно стрелку «команда". В самом деле, если у нас есть три участника: SIP-утройство, Интегрирующий сервер и RTMP сервер, то должен быть интерфейс или API с помощью которого можно дать команду к началу захвата SIP потока и дальнейшей трансляции, т.е. запустить сам кейс.
Другое требование – звонки и трансляции должны иметь возможность устанавливаться параллельно и много. Т.е. можно устанавливать пары SIP Call1 – RTMP Stream1, SIP Call2 – RTMP Stream2, и т.д. Например в случае когда есть несколько вебинаров (комнат), которые идут одновременно.
В качестве сервера/сервиса SIP конференций мы будем использовать сервис Twilio.
Как RTMP сервер, на базе которого может быть построена CDN будем использовать Wowza Streaming Engine.
Интегрирующим сервером будет Web Call Server 4 с поддержкой конвертации и трансляции SIP в RTMP.
Команда серверу для звонка на SIP и перенаправления потока на RTMP будет подаваться через REST/HTTP – пожалуй самого распространенного в интернете способа программного взаимодействия основанного на HTTP.
Данная статья описывает, как можно организовать трансляцию аудиосообщения или аудиозвонка с помощью простого REST/HTTP-запроса.
Для этого потребуются:
- Регистрация в сервисе Twilio и создание SIP домена
- Установка и настройка RTMP-сервера Wowza
- Установка и настройка сервера Web Call Server 4, транслирующего SIP как RTMP
- Установка расширения REST Console для выполнения REST/HTTP запросов вручную из браузера Google Chrome
Twilio
Twilio – это облачная телефонная платформа, предоставляющая API, которое позволяет интегрировать сервисы телефонии в мобильные и web-приложения.
Для использования Twilio необходимо зарегистроваться. После регистрации можно выбрать телефонный номер, которому может быть назначен URL приложения с инструкциями Twilio. Входящий звонок на этот номер будет обрабатываться в соответствии с этими инструкциями. Например, может быть проиграно аудиосообщение или установлено соединение с телефонной конференцией.
Помимо звонка на телефонный номер, с Twilio можно установить SIP-соединение. Для этого необходимо создать и настроить SIP-домен Twilio, которому также может быть назначен “Voice Url” приложения с инструкциями для Twilio.
Чтобы создать SIP-домен Twilio, нужно добавить SIP Endpoint:
Так выглядит список SIP Endpoints:
На SIP-домен Twilio можно позвонить с SIP-устройства, например, с софтфона. Для этого потребуется:
1. Добавить внешний IP устройства в список контроля доступа для IP-адресов (IP Access Control List):
* Вместо ’192.168.1.5’ должен быть указан внешний IP устройства.
2. Добавить имя и пароль в список учетных записей (Credential List):
3. Создать аккаунт софтфона с выключенной регистрацией, указав как домен SIP-домен Twilio и имя и пароль, добавленные в список учетных записей SIP-домена Twilio, как имя и пароль пользователя. Подобный аккаунт софтфона X-Lite будет выглядеть следующим образом:
4. Инициировать звонок на SIP-домен Twilio (например, если имя домена mytwiliodomain.sip.twilio.com, нужно звонить на mytwiliodomain.sip.twilio.com):
Таким образом мы позвонили на Twilio с SIP-софтфона и фактически протестировали SIP часть, забрав и проиграв аудиопоток, участвующий в звонке. Теперь осталось провести такой же звонок с WCS4 сервера и перенаправить полученный аудиотрафик как RTMP.
Web Call Server 4
Для WCS4 потребуется сервер с Linux 64-bit и установленной java. Нужно чтобы консольная команда выводила информацию о Java-машине:
java –version
Если java не установлена, можно установить ее командой:
yum install java
Сервер WCS4 можно скачать здесь, а запросить пробную лицензию — здесь.
Единственное изменение, которое потребуется сделать в настройках сервера после его установки – это сокращение списка кодеков, необходимое для SIP-соединения с SIP-доменом Twilio с передачей только аудио.
Настройка codecs в конфигурационном файле flashphoner.properties (в директории /usr/local/FlashphonerWebCallServer/conf) должна включать только G.711 uLaw:
codecs = ulaw
Файл можно отредактировать, например, с помощью Midnight Commander (mc)
Wowza
Wowza Streaming Engine, можно скачать с wowza.com. Для него потребуется лицензия; можно запросить бесплатную лицезию разработчика. В контрольной панели сервера нужно разрешить публикацию RTMP-потоков в настройках 'Applications' | 'live' | 'Incoming Security'.
Формирование REST / HTTP запроса для начала звонка
После завершения настроек WCS, SIP-домена Twilio и Wowza можно переходить к установлению SIP-соединения между WCS-сервером и SIP-доменом Twilio. В данном случае, чтобы инициировать SIP-звонок, нужно отправить HTTP / REST / POST запрос WCS-серверу. Пример тела подобного REST-запроса в формате JSON.
{
"callId":"R2fhkll5Sw3lK",
"callee":"mytwiliodomain.sip.twilio.com",
"rtmpUrl":"rtmp://my_wowza_server.com:1935/live",
"rtmpStream":"streamName",
"hasAudio":"true",
"hasVideo":"true",
"connection":{
"sipLogin":"myusername",
"sipPassword":"MyPasswordPassword1",
"sipAuthenticationName":"myusername",
"sipDomain":"mytwiliodomain.sip.twilio.com",
"sipPort":"5060",
"sipRegisterRequired":"false",
"appKey":"callApp"
}
}
Значения параметров подобъекта «connection» в запросе выбираются так же, как в аккаунте софтфона:
- «sipRegisterRequired»:«false» – т.е. без SIP регистрации
- «sipDomain»:«mytwiliodomain.sip.twilio.com» — SIP-домен Twilio
- «sipLogin» и «sipPassword» — имя и пароль, добавленные в список учетных записей SIP-домена Twilio
Cреди этих параметров также есть параметр «appKey», указывающий имя стандартого приложения на стороне сервера ('callApp'), которое получает статусы SIP-звонка и ассоциированного с этим звонком RTMP-потока.
Другие параметры:
- «callee»:" mytwiliodomain.sip.twilio.com " – имя вызываемого: SIP-домен Twilio
- «callId»:" R2fhkll5Sw3lK" – SIP Call ID, произвольный уникальный идентификатор для звонка
- «rtmpStream»:«streamName» – RTMP URL с адресом RTMP-сервера, которому будет передаваться аудио звонка
- «rtmpUrl»:«rtmp://my_wowza_server.com:1935/live» – имя потока, который будет опубликован на RTMP-сервере
- «hasAudio»:«true» – будет ли указано в SDP, что WCS будет отправлять RTP аудио трафик для этого звонка
- «hasVideo»:«true» – будет ли указано в SDP, что WCS будет отправлять RTP видео трафик для этого звонка
Параметры «sendrecv» и «recvonly» в SIP
Параметры hasAudio и hasVideo важны. Кейс предполагает, что мы не отправляем трафик на SIP устройство, а только получаем трафик от него. Если hasAudio и hasVideo выставить в «true», то в SDP будет обозначено «sendrecv» (send and receive) для аудио и видео. Некототорые SIP устройства в этом случае будут ждать трафика и сбрасывать SIP-соединение по таймауту если трафика не будет. Поэтому в данном случае придется поднимать время ожидания на самом SIP-устройстве или же выставить hasAudio и hasVideo в «false» для отправки в SDP «recvonly». В этом случае SIP сторона будет знать что мы собираемся только получать видео (receive only) и таймаут сработать не должен.
Отправка REST / HTTP запроса из REST Console
Request URI для подобного REST-вызова будет
http://my_wcs_server.flashphoner.com:9091/RESTCall/call
где my_wcs_server.flashphoner.com – адрес WCS-сервера.
Для отправки REST-вызова потребуется REST-клиент. Можно использовать расширение для браузера Chrome, например REST Console или Advanced REST client, или SIP as RTMP REST-клиент для WCS-сервера (требует установки расширения Allow-Control-Allow-Origin: * для браузера Google Chrome).
Пример интерфейса REST Console с полями, необходимыми для REST-запроса:
Если WCS-сервер запущен, Twilio принимает SIP-звонки и все данные введены корректно, нажимаем кнопку «POST» в REST Console и отправляем запрос на сервер. В итоге установится SIP соединение между WCS и Twilio и аудиопоток будет отправлен по указанному RTMP-адресу.
Воспроизведение потока в RTMP-плеере
Для воспроизведения опубликованного RTMP-потока можно использовать Flash RTMP плеер в примерах Wowza, например:
http://my_wowza_server.com/FlashRTMPPlayer/player.html
Перед началом воспроизведения потока в поля «Server» и «Stream» нужно ввести значения параметров «rtmpUrl» и «rtmpStream», указанные в REST-запросе.
При воспроизведении ассоциированного с SIP-звонком RTMP-потока, в RTMP-плеере можно будет прослушать аудио, прогрываемое приложением доступным по «Voice Url» SIP-домена Twilio.
Трансляция видеопотока, дополнительная информация
Транлировать можно не только аудио, как в случае с Twilio, но и видео с кодеком H.264, в том случае если SIP Endpoint поддерживает и отвечает на видеозвонки.
Полный список поддерживаемых кодеков:
- Аудио: G.711 (alaw или ulaw) или Speex 16 kHz
- Видео: H.264
На схеме ниже проиллюстрирована передача вызовов и медиа.
1. Вызовы (черные стрелки):
- HTTP / REST / POST запрос к WCS-серверу
- SIP-соединение между WCS-сервером и SIP-терминалом (например, SIP-доменом Twilio)
- RTMP-соединение между WCS-сервером и RTMP-сервером
2. Медиа (красные стрелки):
- RTP-медиа от SIP-терминала к WCS-серверу
- RTMP-поток от WCS-сервера к RTMP-серверу
Видео можно транслировать, например, при видеозвонке, установленном с софтфоном (например, Bria). В этом случае значениями параметров REST-вызова:
- «sipDomain» и «sipPort» – будут адрес и порт SIP-сервера, на котором зарегистрирован софтфон
- «sipLogin»/«sipAuthenticationName» и«sipPassword» – имя и пароль учетной записи на этом SIP-сервере
- «callee» – имя учетной записи, использованной для регистрации софтфона
Заключение
Таким образом нам удалось интегрировать сервис Twilio и RTMP сервер, перенаправив SIP аудиопоток на RTMP для дальнейшей раздачи любыми технологически доступными способами.