65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 SIP 从 Twilio 获取音频流并发送到 RTMP CDN 进行进一步分发

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2015年11月21日

CPOL

11分钟阅读

viewsIcon

22747

downloadIcon

151

这是一篇关于集成 SIP 和 RTMP 协议的文章

引言

众所周知,CDN 网络在全球范围内存在,用于向最终用户分发视频流。以观看足球比赛的在线直播为例。

历史上,Adobe 开发的 RTMP 协议曾在一段时间内非常流行,用于分发直播视频,并且每个受尊敬的编码器(捕获摄像机视频流并将其发送到服务器或 CDN 以进行进一步分发的设备或软件应用程序)都支持此协议。

视频向最终用户的进一步分发方法取决于具体的 CDN 和所使用的技术,这些技术允许在各种设备和平台上播放流媒体:Apple HTTP Live Streaming、RTSP、MPEG-DASH、WebRTC、WebSockets 等。

 

背景

同样,历史上,SIP(Session Initiation Protocol)协议主要作为音频通话和电话通信的协议而闻名,也许正因为如此,该协议并未引起 CDN 提供商和 CDN 网络服务器软件供应商的兴趣。

尽管大多数人只将 SIP 与电话通信联系起来,但 SIP 协议最初是作为一种通用的连接建立协议而计划和开发的,用于后续的数据分发:音频、视频、文件、消息等。

截至今日,该协议绝对没有过时,大量软件解决方案和互联网服务以某种形式支持 SIP。其中,大多数是用于视频会议、视频聊天和通信的软件和设备。

因此,在这个技术交汇点——SIP 和 CDN——出现了一个集成问题:如何使用 SIP 设备或电信服务作为视频流源,并将流进一步分发给最终用户。

最简单的例子是在线教育或社交主题的视频会议或网络研讨会,使用支持 SIP 的软件启动,并需要广播到 CDN 网络以广泛传播此次活动。

在本文中,为简化起见,我们仅限于从 SIP 会议捕获音频流,并使用 RTMP 协议进一步广播该流。严格来说,此操作更像是 SIP 请求,随后进行转换和重定向流量,而非视频捕获。

在捕获和广播的示意图中可以看到“Command”箭头。确实,如果存在三个参与者:SIP 设备、集成服务器和 RTMP 服务器,那么必须有一个接口或 API,可以用来发出开始捕获 SIP 流并进行广播的命令,即启动该过程。

另一个要求是:必须能够并行建立多个呼叫和广播会话。也就是说,建立 SIP 呼叫 1 – RTMP 流 1、SIP 呼叫 2 – RTMP 流 2 等对。例如,当同时存在多个网络研讨会(房间)时。

我们将使用 Twilio 服务作为 SIP 会议服务器/服务。

将使用 Wowza Streaming Engine 作为 RTMP 服务器,在此基础上可以构建 CDN。

支持 SIP 到 RTMP 转换和广播的 Web Call Server 4 将作为集成服务器。

发送到服务器以启动 SIP 呼叫和重定向流到 RTMP 的命令将通过 REST/HTTP 发送——这可能是互联网上最广泛使用的基于 HTTP 的软件交互方法。

本文将介绍如何通过简单的 REST/HTTP 请求启动已录制消息或语音通话会话的广播。

这将需要

  • 在 Twilio 服务中注册并创建 SIP Domain
  • 安装和配置 Wowza RTMP 服务器
  • 安装和配置 Web Call Server 4,将 SIP 广播为 RTMP
  • 安装 REST Console 扩展,以便从 Google Chrome 浏览器手动发送 REST/HTTP 请求

Twilio

Twilio 是一个基于云的电话平台,提供 API,允许将电话服务集成到 Web 和移动应用程序中。要使用 Twilio,您需要注册一个账户。

登录后,您可以获得一个电话号码,该号码可以设置为指向应用程序的 URL。该应用程序应包含一组说明,告诉 Twilio 在收到入站呼叫时应该做什么。

例如,播放消息或连接到电话会议。除了呼叫与 Twilio 账户关联的电话号码外,还可以通过 SIP 连接到 Twilio。

为此,有必要创建和配置一个 Twilio SIP Domain,该域也可以被指定为一个带有 Twilio 说明的应用程序的“Voice Url”。要创建 Twilio SIP Domain,请添加一个新的 SIP Endpoint


SIP Endpoints List


您可以从 SIP 设备(例如,软电话)呼叫 Twilio SIP Domain。这需要 1. 将设备的公共 IP 添加到域的 IP 访问控制列表中


* '192.168.1.5' 应替换为设备的公共 IP 2. 将凭据添加到域的凭据列表中: 

 

 

3. 在软电话上配置一个“无注册”账户,以 Twilio SIP Domain 作为域,并将添加到域凭据列表的凭据作为用户 ID 和密码。例如,X-Lite 软电话中的此类账户看起来会是这样

4. 呼叫 Twilio SIP Domain(例如,如果域名为 mytwiliodomain.sip.twilio.com,则呼叫 mytwiliodomain.sip.twilio.com)

这样,我们就从 SIP 软电话呼叫了 Twilio,实际上测试了 SIP 端,接收并播放了通话中的音频流。现在,剩下的是让 WCS4 服务器发起此类呼叫并将接收到的音频流量作为 RTMP 转发。

Web Call Server 4

WCS4 服务器需要一个安装了 Java 的 Linux 64 位服务器。Linux 控制台命令 java –version 必须显示有关 Java 机器的信息。如果未显示,则可以使用 yum install –y java 命令(针对 RedHat)和 apt-get install java 命令(针对 Debian Linux 发行版)安装 Java。

WCS4 服务器版本可以 在此处 下载,并且可以 在此处 申请试用许可。

为了让 SIP 会话与 Twilio SIP Domain 建立音频连接,WCS 配置中唯一需要更改的是编解码器限制。

flashphoner.properties 配置文件(在 /usr/local/FlashphonerWebCallServer/conf 目录中)中的编解码器设置应设置为 G.711 uLaw

codecs = ulaw

可以使用 Midnight Commander (mc) 等工具编辑该文件。


Wowza Streaming Engine

Wowza Streaming Engine 可以从 wowza.com 下载。需要许可证;可以申请免费的开发者许可证。

在此处可以找到关于如何运行 Wowza Streaming Engine 的信息,在此处可以找到关于 Wowza Streaming Engine Manager 的信息,在其中需要在“Applications”|“live”|“Incoming Security”设置中允许 RTMP Publishing。

创建用于启动呼叫的 REST / HTTP 请求

在 WCS、Twilio SIP Domain 和 Wowza 设置完成后,我们可以继续建立 WCS 服务器和 Twilio SIP Domain 之间的 SIP 会话。

在这种情况下,应向 WCS 服务器发送一个 HTTP / REST / POST 请求来启动 SIP 呼叫。以下是 JSON 格式的 REST 请求正文示例


"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 – Twilio SIP Domain
  • sipLoginsipPassword – 添加到 Twilio SIP Domain 凭据列表中的凭据

在这些参数中,还有一个“appKey”参数,设置为标准服务器端应用程序('callApp')的名称,该应用程序将接收与呼叫关联的 SIP 呼叫和 RTMP 流的状态。

其他参数

  • callee:mytwiliodomain.sip.twilio.com – 被叫方名称:Twilio SIP Domain
  • callId:R2fhkll5Sw3lK – SIP 呼叫 ID,呼叫的任意唯一标识符
  • rtmpStream:streamName – 将在 RTMP 服务器上发布的流的名称
  • rtmpUrl:rtmp://my_wowza_server.com:1935/live – RTMP URL,包含将音频传输到的 RTMP 服务器的地址
  • hasAudio:true – 是否会在 SDP 中指示 WCS 将在 SIP 呼叫中发送 RTP 音频流量
  • hasVideo:true – 是否会在 SDP 中指示 WCS 将在 SIP 呼叫中发送 RTP 视频流量

SIP 中的“sendrecv”和“recvonly”参数

hasAudiohasVideo 参数很重要。在这种情况下,我们不向 SIP 设备发送流量,而仅从它接收流量。

如果 hasAudio 和 hasVideo 设置为“true”,则在 SDP 中将为音频和视频指示“sendrecv”(发送和接收)。在这种情况下,某些 SIP 设备将等待流量,并在超时时断开 SIP 会话(如果没有入站流量)。

因此,有必要增加 SIP 设备上的 RTP 非活动计时器值,或者将 hasAudio 和 hasVideo 设置为“false”以在 SDP 中发送“recvonly”(仅接收)。然后 SIP 方将知道我们只接收视频,并且应忽略超时。

从 REST Console 发布 REST / HTTP 请求

此类 REST 调用的请求 URI 将类似于 http://my_wcs_server.flashphoner.com:9091/RESTCall/call,其中 my_wcs_server.flashphoner.com 是 WCS 服务器的地址。

要启动 REST 调用,需要一个 REST 客户端。它可以是 Chrome 扩展程序,如 REST ConsoleAdvanced REST client,或者附加到本文的代码(需要为 Google Chrome 浏览器安装 Allow-Control-Allow-Origin: * extension)。

以下是 REST Console 界面示例,其中包含 REST 请求所需的字段

如果 WCS 服务器已启动,Twilio 接收 SIP 呼叫并且所有数据输入正确,请单击 REST Console 中的“POST”按钮将请求发送到服务器。

结果是,将建立 WCS 和 Twilio 之间的 SIP 会话,并将音频流传输到指定的 RTMP 地址。

RTMP 播放器中的流播放

可以使用 Wowza 示例 Flash RTMP 播放器播放发布的 RTMP 流,例如

http://my_wowza_server.com/FlashRTMPPlayer/player.html

在开始流播放之前,应在 **Server** 和 **Stream** 字段中输入 REST 请求中指定的 **rtmpUrl** 和 **rtmpStream** 参数的值。



 


当播放与 SIP 呼叫关联的 RTMP 流时,使用 RTMP 播放器的听众将听到通过分配给 Twilio SIP Domain 的“Voice Url”可用的应用程序播放的音频。

恭喜!如果您听到了音频,则意味着您已成功部署并测试了带有 Twilio 的“SIP 到 RTMP”方案。

视频流广播,附加信息

WCS4 的“SIP 作为 RTMP”功能不仅可以像与 Twilio 的通话那样流式传输音频,还可以流式传输视频。

该功能支持的完整编解码器列表是

  • 音频:G.711 (allaw 或 ulaw) 或 Speex 16 kHz
  • 视频:H.264

下图说明了通话流通信路径

1. 信令(黑线)

  • HTTP / REST / POST 请求到 WCS 服务器
  • WCS 服务器和 SIP Endpoint(例如 Twilio SIP Domain)之间的 SIP 会话
  • WCS 服务器和 RTMP 服务器之间的 RTMP 连接

2. 流媒体(红线)

  • SIP Endpoint 到 WCS 服务器的 RTP 媒体
  • WCS 服务器到 RTMP 服务器的 RTMP 流

视频可以流式传输,例如,用于与软电话(如 Bria)建立的视频 SIP 呼叫。在这种情况下,REST 调用参数的值。

sipDomainsipPort – 是软电话注册的 SIP 服务器的地址和端口
sipLoginsipAuthenticationNamesipPassword – 是 SIP 服务器上账户的凭据
callee – 是软电话注册的 SIP 用户名

结论

这样,我们就能够集成 Twilio 服务和 RTMP 服务器,将 SIP 音频流重定向到 RTMP,以便通过任何可用的技术手段进行进一步分发。

使用代码

下载 sip-as-rtmp-html-js-example.zip

  1. 确保您已安装所有必要的后台软件:Wowza、Web Call Server、Twilio。
  2. 在您的 Web 浏览器中打开 html 页面,并管理 SIP/RTMP 呼叫。

注意:

HTML 页面在跨域模式下无法正常工作(即,如果您在本地打开 sip-as-rtmp.html 页面,或者它通过 HTTP 从不同域加载)。

为避免跨域问题,您可以添加 Chrome 扩展程序 Allow-Control-Allow-Origin: *,或者使用 REST Console 或任何其他 REST 客户端手动操作。

链接

Allow-Control-Allow-Origin: * - 一个 Chrome 浏览器扩展程序,用于解决 sip-as-rtmp.html 页面的跨域问题

REST Console - 一个用于手动 REST/HTTP 测试的 Chrome 浏览器扩展程序

Web Call Server - 集成流媒体服务器 

Wowza Streaming Engine - 流媒体服务器

Twilio - 云电话平台

X-Lite - 用于测试的免费 SIP 软电话 

 

© . All rights reserved.