Pull to refresh

Забираем аудиопоток с Twilio по SIP и отправляем на RTMP CDN для дальнейшей раздачи

Reading time 8 min
Views 6.9K
image

Как известно, в природе существуют CDN-сети, которые используются для доставки потокового видео конечным пользователям. Взять к примеру онлайн-трансляцию футбольного матча. Исторически сложилось, что протокол RTMP, разработанный Adobe, в определенное время стал очень популярен для доставки Live-видеоконтента, и поддержка этого протокола есть в каждом уважающем себя Encoder–устройстве или программе, которая захватывает видеопоток с камеры и отправляет на сервер или CDN для последующей раздачи. В статье описывается как сделать SIP источником потока для CDN.

Способы дальнейшей доставки видео конечным пользователям зависят от конкретной CDN и используемых технлогий, которые позволяют отобразить поток на множестве устройств и платформ: Apple HTTP Live Streaming, RTSP, MPEG-DASH, WebRTC, Websockets, и т.д.

image

Также исторически сложилось, что протокол SIP (Session Initiation Protocol) известен в основном как протокол для аудиозвонков и телефонии и скорее всего по этой причине этот протокол не попал в зону интересов CDN-провайдеров и вендоров серверного программного обеспечения для CDN-сетей.

image

Хотя у многих SIP ассоциируется только с телефонией, протокол SIP изначально планировался и разрабатывался как универсальный протокол установки соединения для последующей передачи произвольных данных: аудио, видео, файлы, сообщения, и т.д. На сегодняшний день протокол совершенно не устарел и большое количество программного обеспечения и интернет-сервисов поддерживает SIP протокол в том или ином виде. В основном это ПО и оборудование связанное с видеоконференциями, видеочатами, коммуникациями.

В итоге на этом технологическом стыке: SIP и CDN появилась интеграционная задача по использованию SIP устройств или телекоммуникационного сервиса, как источника видеопотока для CDN сети с последующей раздачей этого видеопотока конечным пользователям.

image

Самым простым примером может послужить видеоконференция или вебинар образовательной или публичной тематики, развернутый на базе программного обеспечения с поддержкой SIP и требующий трансляции в CDN сеть для широкого представления события.

image

В данной статье мы для простоты ограничимся захватом аудио потока с SIP-конференции и дальнейшей трансляцией этого потока по протоколу RTMP. Строго говоря, такое действие является скорее SIP-вызовом с дальнейшей переконвертацией и перенаправлением трафика нежели захватом видео.

image

На схеме захвата и трансляции видно стрелку «команда". В самом деле, если у нас есть три участника: SIP-утройство, Интегрирующий сервер и RTMP сервер, то должен быть интерфейс или API с помощью которого можно дать команду к началу захвата SIP потока и дальнейшей трансляции, т.е. запустить сам кейс.

Другое требование – звонки и трансляции должны иметь возможность устанавливаться параллельно и много. Т.е. можно устанавливать пары SIP Call1 – RTMP Stream1, SIP Call2 – RTMP Stream2, и т.д. Например в случае когда есть несколько вебинаров (комнат), которые идут одновременно.

image

В качестве сервера/сервиса 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:

image

Так выглядит список SIP Endpoints:

image

На SIP-домен Twilio можно позвонить с SIP-устройства, например, с софтфона. Для этого потребуется:

1. Добавить внешний IP устройства в список контроля доступа для IP-адресов (IP Access Control List):

image

* Вместо ’192.168.1.5’ должен быть указан внешний IP устройства.

2. Добавить имя и пароль в список учетных записей (Credential List):

image

3. Создать аккаунт софтфона с выключенной регистрацией, указав как домен SIP-домен Twilio и имя и пароль, добавленные в список учетных записей SIP-домена Twilio, как имя и пароль пользователя. Подобный аккаунт софтфона X-Lite будет выглядеть следующим образом:

image

4. Инициировать звонок на SIP-домен Twilio (например, если имя домена mytwiliodomain.sip.twilio.com, нужно звонить на mytwiliodomain.sip.twilio.com):

image

Таким образом мы позвонили на Twilio с SIP-софтфона и фактически протестировали SIP часть, забрав и проиграв аудиопоток, участвующий в звонке. Теперь осталось провести такой же звонок с WCS4 сервера и перенаправить полученный аудиотрафик как RTMP.

image

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)

image

image

Wowza


Wowza Streaming Engine, можно скачать с wowza.com. Для него потребуется лицензия; можно запросить бесплатную лицезию разработчика. В контрольной панели сервера нужно разрешить публикацию RTMP-потоков в настройках 'Applications' | 'live' | 'Incoming Security'.

image

Формирование 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-вызова будет

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-запроса:

image

Если WCS-сервер запущен, Twilio принимает SIP-звонки и все данные введены корректно, нажимаем кнопку «POST» в REST Console и отправляем запрос на сервер. В итоге установится SIP соединение между WCS и Twilio и аудиопоток будет отправлен по указанному RTMP-адресу.

Воспроизведение потока в RTMP-плеере


Для воспроизведения опубликованного RTMP-потока можно использовать Flash RTMP плеер в примерах Wowza, например: my_wowza_server.com/FlashRTMPPlayer/player.html


image

Перед началом воспроизведения потока в поля «Server» и «Stream» нужно ввести значения параметров «rtmpUrl» и «rtmpStream», указанные в REST-запросе.

image

При воспроизведении ассоциированного с 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-серверу

image

Видео можно транслировать, например, при видеозвонке, установленном с софтфоном (например, Bria). В этом случае значениями параметров REST-вызова:

  • «sipDomain» и «sipPort» – будут адрес и порт SIP-сервера, на котором зарегистрирован софтфон
  • «sipLogin»/«sipAuthenticationName» и«sipPassword» – имя и пароль учетной записи на этом SIP-сервере
  • «callee» – имя учетной записи, использованной для регистрации софтфона

Заключение


Таким образом нам удалось интегрировать сервис Twilio и RTMP сервер, перенаправив SIP аудиопоток на RTMP для дальнейшей раздачи любыми технологически доступными способами.
Tags:
Hubs:
+6
Comments 0
Comments Leave a comment

Articles