Ретрансляция SIP-звонка в RTMP поток на заданный сервер (функция SIP as RTMP)¶
Описание¶
SIP-звонок, произведенный через WCS-сервер, может быть захвачен в RTMP-поток и ретранслирован на указанный RTMP-сервер при создании звонка. Одним из примеров использования может быть трансляция звонка на Facebook или Youtube.
Схема работы¶
- Браузер начинает звонок с помощью REST-вызова /call/startup
- WCS соединяется с SIP-сервером
- SIP-сервер передает RTP-поток звонка на WCS
- WCS соединяется с RTMP-сервером
- RTMP-сервер получает RTMP-поток
Краткое руководство по тестированию¶
-
Для тестирования используем:
- два SIP-аккаунта;
- программный телефон для ответа на звонок;
- REST-клиент в браузере Chrome;
- RTMP-сервер для приема трансляции;
- веб-приложение Player для воспроизведения потока с RTMP-cервера.
-
Откройте REST-клиент. Отправьте запрос
/call/startup
на WCS-сервер, указав в параметрах запроса:- параметры Вашего SIP-аккаунта, с которого будет совершен звонок
- URL RTMP-сервера, куда будет ретранслирован звонок, в данном случае укажите URL WCS-сервера
- имя потока для ретрансляции звонка (параметр
rtmpStream
), например,rtmp_stream1
; - имя Вашего второго SIP-аккаунта, на который будет совершаться звонок
-
Примите входящий звонок на программном телефоне:
-
Откройте веб-приложение Player. Укажите URL RTMP-сервера и имя RTMP-потока, в который перенаправлен звонок, и нажмите кнопку
Play
. Начнется воспроизведение звонка:
-
Завершите звонок со стороны программного телефона.
Последовательность выполнения операций¶
Ниже описана последовательность вызовов при использовании примера SIP as RTMP для создания звонка
-
Отправка REST-запроса
/call/startup
:
sendREST()
code
function startCall() { ... var url = field("restUrl") + "/call/startup"; callId = generateCallID(); $("#sipCallId").val(callId); ... var RESTCall = {}; RESTCall.toStream = field("rtmpStream"); RESTCall.hasAudio = field("hasAudio"); RESTCall.hasVideo = field("hasVideo"); RESTCall.callId = callId; RESTCall.sipLogin = field("sipLogin"); RESTCall.sipAuthenticationName = field("sipAuthenticationName"); RESTCall.sipPassword = field("sipPassword"); RESTCall.sipPort = field("sipPort"); RESTCall.sipDomain = field("sipDomain"); RESTCall.sipOutboundProxy = field("sipOutboundProxy"); RESTCall.appKey = field("appKey"); RESTCall.sipRegisterRequired = field("sipRegisterRequired"); for (var key in RESTCall) { setCookie(key, RESTCall[key]); } RESTCall.callee = field("callee"); var data = JSON.stringify(RESTCall); sendREST(url, data); startCheckCallStatus(); }
-
Установка соединения с SIP-сервером
-
Получение подтверждения от SIP-сервера
-
RTP-поток передается на WCS-сервер
-
Публикация RTMP-потока на RTMP-сервере
-
RTMP-поток передается на RTMP-сервер
-
Отправка REST-запроса /call/terminate:
sendREST()
code
-
Отправка команды на SIP-сервер
-
Получение подтверждения от SIP-сервера
Известные проблемы¶
1. Поток, захваченный из звонка, не проигрывается, если не инициализирована RTP-сессия для этого потока¶
Симптомы
Поток звонка создается на сервере, но не воспроизводится.
Решение
Включить принудительную инициализацию RTP-сессии при помощи настройки
2. DTMF-посылки не распознаются SIP-стороной, если не включена генерация аудиоданных¶
Симптомы
SIP-сторона не распознает PIN-код, набранный при помощи DTMF
Решение
Включить генерацию аудио и видеоданных для звонка при помощи настройки
3. При ретрансляции потока звонка как RTMP, могут быть фризы и рассинхронизация звука и видео при проигрывании потока¶
Симптомы
При проигрывании ретранслированного потока, наблюдаются фризы и рассинхронизация звука и видео
Решение
a) в сборках до 5.2.1541 добавить задержку на включение аудио-видео генератора
b) обновить WCS до сборки 5.2.1541, в которой данная проблема исправлена
4. При ретрансляции видеозвонка в поток в некоторых случаях необходимо включить буферизацию RTP трафика¶
Симптомы
При видеозвонках на некоторые софтфоны заметна рассинхронизация между видео и аудио при проигрывании RTMP потока