介绍
在实现 WebRTC 通话过程中,需要通过 Session Initiation Protocol (SIP) 进行信令交互。@johanblumenberg/sip.js 是一个基于 WebRTC 标准的 SIP 库,它提供了一些方便的 API,使得我们可以用 JavaScript 编写 WebRTC 应用程序中的信令处理部分。本文将介绍 @johanblumenberg/sip.js 的使用方式,包括如何安装、功能特点、API 接口以及使用案例等。
安装
首先,你需要在项目中安装 @johanblumenberg/sip.js 包,可以使用 npm 命令进行安装:
npm install @johanblumenberg/sip.js --save
功能特点
@johanblumenberg/sip.js 在 WebRTC 信令处理方面提供了如下功能:
- SIP 协议支持,包括 INVITE, ACK, BYE, OPTIONS, MESSAGE, NOTIFY 等常用信令
- WebSocket 支持,基于 ws 模块
- WebRTC 连接协商,包括 Offer/Answer 和 Trickle ICE
- 媒体协商,包括 SDP 预处理和音视频编解码协商
- 信令超时处理,包括请求超时、响应超时等
API 接口
@johanblumenberg/sip.js 具有一下 API 接口:
SIP
SIP
类是整个库的核心,它实现了 SIP 协议的处理以及 WebRTC 的连接协商。
构造函数
new SIP.UA(configuration, [delegate]);
configuration
:Object
配置对象delegate
:Object
代理对象
构造函数接受两个参数:
configuration
: 配置对象,它包含一些必要的配置信息,例如身份验证、端口、协议等信息。常见的配置如下:
{ uri: 'sip:alice@example.com', transportOptions: { wsServers: ['ws://example.com:5060', 'wss://example.org'] }, password: 'password' }
uri
表示 SIP 用户的 URI,transportOptions
表示传输层选项,password
表示 SIP 用户的密码。
delegate
:代理对象,它包含一些事件回调函数,用于处理 SIP 协议相关的事件。两个回调函数示例:
{ onInvite: function(session) { console.log('Invite received:', session); }, onDisconnect: function(session) { console.log('Session disconnected:', session); } }
connect
UA.connect();
该接口用于连接到 SIP 服务器,如果连接成功,将触发 connected
事件,否则将触发 disconnected
事件。
disconnect
UA.disconnect();
该接口用于断开与 SIP 服务器的连接。
call
UA.call(target, [mediaStream], [options]);
该接口用于发起一次呼叫。target
和 mediaStream
分别表示被叫 URI 和媒体流。options
表示一些可选项。
answer
session.answer([mediaStream]);
该接口用于应答呼叫,mediaStream
表示媒体流。
hold
session.hold();
该接口用于将呼叫保持。
callback
session.callback([code, [reason]]);
该接口用于发送回复信令,code
和 reason
分别表示回复码和原因。
hangup
session.hangup();
该接口用于挂断呼叫。
SIP.js WebRTC API
@johanblumenberg/sip.js 内置了一组 WebRTC API, 它们实现了 WebRTC 中的 Offer/Answer 和 Trickle ICE 算法。
Constructor (options)
var RTCSessionDescription = SIP.WebRTC.RTCSessionDescription; var sessionDescription = new RTCSessionDescription({ type: 'offer', sdp: "v=0\r\no=- 381260326840520978 2 IN IP4 127.0.0.1\r\ns=gst-switch\r\nc=IN IP4 127.0.0.1\r\nt=0 0\r\na=ice-ufrag:j1jYo/7oyz08/rye\r\na=msid-semantic: WMS 5c5da0ba-ebbb-4231-aff7-a69807f0bddf\r\nm=video 19700 RTP/AVP 96 97 98 0 99 127\r\nb=AS:1000\r\na=rtpmap:96 H264/90000\r\na=rtpmap:97 VP8/90000\r\na=rtpmap:98 VP9/90000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:99 H264/90000\r\na=rtpmap:127 H264/90000\r\na=fmtp:96 packetization-mode=1;level-asymmetry-allowed=1;profile-level-id=42c01e\r\na=rtcp-fb:97 nack\r\na=rtcp-fb:97 nack pli\r\na=rtcp-fb:97 goog-remb\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:99 nack\r\na=rtcp-fb:99 nack pli\r\na=rtcp-fb:99 goog-remb\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=rtcp-fb:127 goog-remb\r\na=ssrc:296458240 cname:waLrk1/CRDShiJWL\r\na=ssrc:296458240 msid:5c5da0ba-ebbb-4231-aff7-a69807f0bddf 4d4f4afa-352a-4c1f-9082-e5040f17baed\r\na=ssrc:296458240 mslabel:5c5da0ba-ebbb-4231-aff7-a69807f0bddf\r\na=ssrc:296458240 label:4d4f4jfa-352a-4c1f-9082-e5040f17baed" });
该构造函数用于初始化 WebRTC 会话描述对象(Session Description)。
toSDP()
RTCSessionDescription.prototype.toSDP();
该接口用于将 WebRTC 会话描述对象转换为 SDP 字符串。
fromSDP()
RTCSessionDescription.prototype.fromSDP(sdp);
该接口用于将 SDP 字符串转换为 WebRTC 会话描述对象。
newRTCSessionDescription()
var RTCSessionDescription = SIP.WebRTC.RTCSessionDescription; var sessionDescription = new RTCSessionDescription(); sessionDescription.newRTCSessionDescription(sdp)
该接口用于通过 SDP 字符串初始化 RTCSessionDescription 对象。
使用案例
以下是一个使用 @johanblumenberg/sip.js 的简单案例,它演示了如何发起一次呼叫。该案例假设你已经创建了一个唯一的 SIP URI,并且有与之对应的 WebSocket 服务器:
-- -------------------- ---- ------- ------ --- ---- -------------------------- -- --- ----- ------------- - - ---- --------------------------- ----------------- - ---------- -------------------- -- --------- ----- --------- ---------- -- -- ---- ----- -------- - - --------- ----------------- - ------------------- ----------- --------- -- ------------- ----------------- - -------------------- --------------- --------- - -- -- -- --- -- ----- -- - --- --------------------- ---------- -- -- --- --- ------------- -- ---- ----- ------ - ------------------------ ----------------
总结
本文介绍了 @johanblumenberg/sip.js 的使用方式,包括如何安装、功能特点、API 接口以及使用案例等。该库提供了一组 WebRTC 信令处理API,使得开发人员可以方便地实现 WebRTC 应用程序中的信令交换。如果你正在开发 WebRTC 应用程序,不妨尝试一下 @johanblumenberg/sip.js。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/600672673660cf7123b365b1