Перенаправление SIP-звонка в поток (функция SIP as Stream)¶
Описание¶
SIP-звонок, произведенный через WCS-сервер, может быть захвачен в поток на сервере при создании звонка. Затем этот поток можно воспроизвести в браузере любым способом из поддерживаемых WCS.
Поток, захваченный из SIP-звонка, может быть ретранслирован на RTMP-сервер при помощи REST-запроса /push/startup
, как любой медиапоток на WCS-сервере.
Схема работы¶
- Браузер начинает звонок с помощью REST-вызова
/call/startup
- WCS соединяется с SIP-сервером
- SIP-сервер передает RTP-поток звонка на WCS
- Второй браузер запрашивает воспроизведение потока звонка
- Второй браузер получает WebRTC-поток
Краткое руководство по тестированию¶
-
Для тестирования используем:
- два SIP-аккаунта;
- программный телефон для ответа на звонок;
- REST-клиент в браузере Chrome;
- веб-приложение Player для воспроизведения потока.
-
Откройте REST-клиент. Отправьте запрос
/call/startup
на WCS-сервер, указав в параметрах запроса:- параметры Вашего SIP-аккаунта, с которого будет совершен звонок
- имя потока для ретрансляции звонка (параметр
toStream
), например,call_stream1
- имя Вашего второго SIP-аккаунта, на который будет совершаться звонок
-
Примите входящий звонок на программном телефоне:
-
Откройте веб-приложение Player, укажите в поле
Stream
имя потока, в который перенаправлен звонок (в нашем примереcall_stream1
):
-
Нажмите
Play
. Начнется воспроизведение потока:
-
Для завершения звонка отправьте из REST-клиента запрос
/call/terminate
на WCS-сервер, указав в параметрах запроса идентификатор звонка:
Последовательность выполнения операций¶
Ниже описана последовательность вызовов при использовании примера SIP as RTMP для создания звонка и примера Player для его воспроизведения
-
Отправка REST-запроса
/call/startup
:
sendREST()
code
function startCall() { ... var url = field("restUrl") + "/call/startup"; callId = generateCallID(); ... 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-сервер
-
Установка соединения браузера с сервером:
Flashphoner.createSession()
code
Flashphoner.createSession({urlServer: url}).on(SESSION_STATUS.ESTABLISHED, function(session){ setStatus(session.status()); //session connected, start playback playStream(session); }).on(SESSION_STATUS.DISCONNECTED, function(){ setStatus(SESSION_STATUS.DISCONNECTED); onStopped(); }).on(SESSION_STATUS.FAILED, function(){ setStatus(SESSION_STATUS.FAILED); onStopped(); });
-
Получение от сервера события, подтверждающего успешное соединение:
CONNECTION_STATUS.ESTABLISHED
code
-
Запрос на воспроизведение потока:
Stream.play()
code
stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) { var video = document.getElementById(stream.id()); if (!video.hasListeners) { video.hasListeners = true; video.addEventListener('playing', function () { $("#preloader").hide(); }); video.addEventListener('resize', function (event) { var streamResolution = stream.videoResolution(); if (Object.keys(streamResolution).length === 0) { resizeVideo(event.target); } else { // Change aspect ratio to prevent video stretching var ratio = streamResolution.width / streamResolution.height; var newHeight = Math.floor(options.playWidth / ratio); resizeVideo(event.target, options.playWidth, newHeight); } }); } ... }); stream.play();
-
Получение от сервера события, подтверждающего успешное проигрывание потока:
STREAM_STATUS.PLAYING
code
-
Отправка аудио-видео потока по WebRTC
-
Остановка воспроизведения потока:
Stream.stop()
code
-
Получение от сервера события, подтверждающего остановку воспроизведения потока:
STREAM_STATUS.STOPPED
code
stream = session.createStream(options).on(STREAM_STATUS.PENDING, function(stream) { ... }).on(STREAM_STATUS.PLAYING, function(stream) { ... }).on(STREAM_STATUS.STOPPED, function() { setStatus(STREAM_STATUS.STOPPED); onStopped(); }).on(STREAM_STATUS.FAILED, function(stream) { ... }).on(STREAM_STATUS.NOT_ENOUGH_BANDWIDTH, function(stream){ ... }); stream.play();
-
Отправка REST-запроса
/call/terminate
:
sendREST()
code
-
Отправка команды на SIP-сервер
-
Получение подтверждения от SIP-сервера
Запись потоков SIP-звонков¶
Потоки, полученные из SIP-звонков, могут быть записаны на сервере. Для этого необходимо указать следующие настройки в файле flashphoner.properties:
При этом поддерживаются следующие кодеки:
- Видео: H264
- Аудио: opus, PCMA (alaw), PCMU (ulaw)
Запись потоков на сервере подробно описана в соответствующем разделе.
Известные проблемы¶
1. Поток, захваченный из звонка, не проигрывается, если не инициализирована RTP-сессия для этого потока¶
Симптомы
Поток звонка создается на сервере, но не воспроизводится
Решение
Включить принудительную инициализацию RTP-сессии при помощи настройки
2. При ретрансляции потока звонка как RTMP, могут быть фризы и рассинхронизация звука и видео при проигрывании потока¶
Симптомы
При ретрасляции потока звонка как RTMP запросом /push/startup
и проигрывании ретранслированного потока, наблюдаются фризы и рассинхронизация звука и видео
Решение
a) в сборках до 5.2.1541 добавить задержку на включение аудио-видео генератора
b) обновить WCS до сборки 5.2.1541, в которой данная проблема исправлена
3. При ретрансляции видеозвонка в поток в некоторых случаях необходимо включить буферизацию RTP трафика¶
Симптомы
При видеозвонках на некоторые софтфоны заметна рассинхронизация между видео и аудио при проигрывании потока