Versions Compared


  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Example of delivery of a video stream from SIP to RTMP server

This example demonstrates how to make a call to SIP, receive audio and video traffic from SIP in response and then redirect the received video stream to a third-party RTMP server or to a built into the WCS RTMP server, or to a third-party CDN accepting RTMP streams for further broadcasting.

Image RemovedImage Added

The screenshot illustrates the following:

  1. In the left part, we fill in the data of the SIP account we will be using for the call. If the SIP server requires no authorization, you can specify arbitrary login and password, like 'abcd'.
  2. In the right part, we enter the RTMP address of the server and the name of the video stream. This address will accept the redirected SIP traffic as soon as connection is successfully established.
  3. Call the SIP subscriber '10050'. Below, we have an option to send a DTMF signal if the SIP side implements a voice menu. After the connection to SIP is successfully established, the ESTABLISHED status is displayed.The test RTMP player allows conducting a test right after the SIP connection is established. Simply specify the full RTMP URL including the name of the video stream and click ‘Play’. As a result, the video stream received from the SIP side begins to play.
  4. RTMP playback URL may be copied to a third party player (ffplay, VLC etc)

Code of the example

This example is a simple REST client written on JavaScript, available at:


sip-as-rtmp.js - a script dealing with REST calls to the WCS server
sip-as-rtmp.html - example page


Analyzing the code


To examine the code, let’s take this version of the sip-as-rtmp.js with the hash f3f10c82e927ea73b333a56b99e4af1530500bec, located here and available for downloading in ecbadc3 which is available here and can be downloaded with the corresponding build

1. Load the test RTMP player on the page for further RTMP stream playback test.


Code Block
function loadPlayer() {
    var attributes = {}; = "player"; = "player";
    var flashvars = {};
    var pathToSWF = "../../dependencies/swf/player.swf";
    var elementId = "player";
    var params = {}; = "true";
    params.swliveconnect = "true";
    params.allowfullscreen = "true";
    params.allowscriptaccess = "always";
    params.bgcolor = "#777777";
    swfobject.embedSWF(pathToSWF, elementId, "350", "400", "11.2.202", "expressInstall.swf", flashvars, params, attributes);

2. 212.

1. REST / HTTP queries sending.


Sending is done using POST method with ContentType application/json by AJAX query using Jquery framework.


2. Making outgoing call with REST-request /call/startup


Connection data (connection) to establish connection and call data (RESTCall) are collected from the boxes on page.

Code Block
    var url = field("restUrl") + "/call";
    callId = generateCallID();

    var connection = {};
    connection.sipLogin = field("sipLogin");
    connection.sipPassword = field("sipPassword");
    connection.sipPort = field("sipPort");
    connection.sipDomain = field("sipDomain");
    connection.appKey = field("appKey");
    connection.sipRegisterRequired = field("sipRegisterRequired");

    for (var key in connection) {
        setCookie(key, connection[key]);

    var RESTCall = {};
    RESTCall.rtmpStream = field("rtmpStream");
    RESTCall.hasAudio = field("hasAudio");
    RESTCall.hasVideo = field("hasVideo");
    RESTCall.callId = callId;
    RESTCall.rtmpUrl = field("rtmpUrl");

    for (var key in RESTCall) {
        setCookie(key, RESTCall[key]);

    RESTCall.connection = connection;
    RESTCall.callee = field("callee");

    var data = JSON.stringify(RESTCall);

    sendREST(url, data);

43. The status of the SIP call is monitored with the /getStatus query


Code Block
function getStatus() {
    var url = field("restUrl") + "/getStatus";
    var currentCallId = { callId: callId };
    $("#callTrace").text(callId + " >>> " + field("rtmpUrl"));
    var data = JSON.stringify(currentCallId);
    sendREST(url, data);

54. If the call PBX has a voice menu, the DTMF signal can be sent using the /sendDTMF query.


Code Block
function sendDTMF(value) {
    var url = field("restUrl") + "/sendDTMF";
    var data = {};
    data.callId = callId;
    data.dtmf = value;
    data.type = "RFC2833";
    data = JSON.stringify(data);
    sendREST(url, data);

5. RTMP URL displaying on the page to copy to a third party player


Code Block
function sendDataToPlayer() {
    var host = field("rtmpUrl")
        .replace("localhost", window.location.hostname)
        .replace("", window.location.hostname);

    var rtmpStreamPrefix = "rtmp_";
    var url = host + "/" + rtmpStreamPrefix + field("rtmpStream");