Описание

SIP-звонок, произведенный через WCS-сервер, может быть захвачен в RTMP-поток и ретранслирован на указанный RTMP-сервер при создании звонка. Одним из примеров использования может быть трансляция звонка на Facebook или Youtube.

Схема работы

  1. Браузер начинает звонок с помощью REST-вызова /call/startup
  2. WCS соединяется с SIP-сервером
  3. SIP-сервер передает RTP-поток звонка на WCS
  4. WCS соединяется с RTMP-сервером
  5. RTMP-сервер получает RTMP-поток

Краткое руководство по тестированию

1. Для тестирования используем:

2. Откройте REST-клиент. Отправьте запрос /call/startup на WCS-сервер, указав в параметрах запроса:

3. Примите входящий звонок на программном телефоне:


4. Откройте веб-приложение Player. Укажите URL RTMP-сервера и имя RTMP-потока, в который перенаправлен звонок, и нажмите кнопку "Play". Начнется воспроизведение звонка:


5. Завершите звонок со стороны программного телефона.

Последовательность выполнения операций (Call Flow)

Ниже описана последовательность вызовов при использовании примера SIP as RTMP для создания звонка

sip-as-rtmp-4.html

sip-as-rtmp-4.js


1. Отправка 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();

}


2. Установка соединения с SIP-сервером

3. Получение подтверждения от SIP-сервера

4. RTP-поток передается на WCS-сервер

5. Публикация RTMP-потока на RTMP-сервере

6. RTMP-поток передается на RTMP-сервер

7. Отправка REST-запроса /call/terminate:

sendREST() code

function hangup() {
    var url = field("restUrl") + "/call/terminate";
    var currentCallId = { callId: callId };
    var data = JSON.stringify(currentCallId);
    sendREST(url, data);
}


8. Отправка команды на SIP-сервер

9. Получение подтверждения от SIP-сервера

Известные проблемы

1. Поток, захваченный из звонка, не проигрывается, если не инициализирована RTP-сессия для этого потока

Симптомы: поток звонка создается на сервере, но не воспроизводится.

Решение: включить принудительную инициализацию RTP-сессии при помощи настройки

rtp_session_init_always=true

2. DTMF-посылки не распознаются SIP-стороной, если не включена генерация аудиоданных

Симптомы: SIP-сторона не распознает PIN-код, набранный при помощи DTMF

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

generate_av_for_ua=all