作者:James Cadd(原文链接)
翻译:刘通
对实时通信领域感兴趣的人们肯定对Google的WebRTC项目很熟悉。引用WebRTC官网的话:
“WebRTC是一项免费的,开源的项目,可以通过简单的API为你的浏览器以及移动端应用提供实时通信(RTC)的能力。WebRTC的各个部分已经为实现这个目的而进行了优化以达到最佳效果。”
在微软,我们看到了最近5年WebRTC的飞速发展。WebRTC最关键的一个功能就是搭建本地视频聊天app,至今已经拥有超过10亿的用户。
Google的WebRTC支持包括iOS,安卓,以及传统Win32电脑端应用软件。Windows方面,微软Edge浏览器之前就已经支持ORTC API了,并且现在也在电脑端上的内部预览版中支持WebRTC 1.0 API。举个例子,如果你想要用HTML/JS在电脑浏览器或者电脑版网页应用上使用Web App Template搭建一个WebRTC应用的话,微软Edge浏览器以及Windows网络平台(Windows web platform)将会是一个很好的选择。
但是如果你想要使用C#或者C++编写,并且在Xbox,HoloLens,Surface Hub,Windows 手机上运行WebRTC怎么办,亦或是使用HTML/JS编写然后在Raspberry Pi上运行呢?如果你使用Google的iOS和安卓库编写的软件然后想完全兼容你的UWP应用又该怎么办?又如果你对你应用的WebRTC源做了些改进,为了想让着些改动在你的UWP应用使用,又该如何做呢?
为了解决类似于上面这些问题,以及覆盖其他的场景,我们发布并且优化了UWP的WebRTC 1.0。现在已经作为开源项目上传到GitHub上,并且也以NuGet包的形式呈现出来。这个项目百分之百兼容Google资源,允许像从运行UWP的Xbox上打WebRTC视频通话给电脑版的Chrome浏览器这种场景发生。
微软也已经长时间地支持ORTC API,并且我们与Open Peer Foundation一直维持着亲密的合作,以确保给UWP应用提供最佳的ORTC支持。ORTC是WebRTC API的一种升级,它可以给开发者对媒体及数据传输通道精细的控制权,并且使用标准的JSON格式来描述对等端性能,而不是像WebRTC一样只能够使用SDP。
ORTC被设计为可以与WebRTC进行互操作,并且所有媒体都与WebRTC兼容。ORTC还包括一个适配模块将SDP转换成JSON以及找出匹配WebRTC的API。这两点让开发者可以以自在地从WebRTC转换到ORTC,并且允许WebRTC与ORTC用户之间进行视频通话。UWP的ORTC也已经作为开源项目上传到GitHub上以及可以以NuGet包形式获得。
将UWP和Edge支持的WebRTC 1.0和ORTC相连接起来的好处就是,所有的Windows 10平台都支持RTC通话,而且开发者可以选择他们喜欢的开发方案。
让我们来看一下我们在GitHub示例库中的例子。
DataChannel,作为WebRTC和ORTC说明的一部分,是两方交换数据的机制。这在IoT应用中会非常有用—举个例子,Raspberry Pi可以收集传感器数据然后将其实时传递给手机或者HoloLens设备。需要记住的是,尽管下面的示例代码使用的是ORTC API,同样的场景对WebRTC也是适用的。
为了通过ORTC在两端之间进行信息交换,首先必须完成以下几点(查看示例代码中的MainPage.OpenDataChannel() ):
#1 双方必须交换ICE候选项,成功的一对将会被用来建立端到端连接。
#2 双方必须交换ICE参数,以及开启一个ICE传输会话—对等端用来传输数据的数据通道。
#3 对等端必须交换DTLS参数。包括了加密证书以及指纹数据用来建立安全的端到端连接,然后建立一个DTLS传输会话。
#4 对等端必须交换SCTP性能,以及建立一个SCTP传输会话。在这步,对等端间安全的连接已经建立起,DataChannel可以打开。
重点需要理解上面说的两点。第一,数据是以简单的JSON进行交换的,并且只要两端可以交换字符串,他们就也可以交换所有类型的所需数据。第二,对等端的标识,以及这些参数的交换,成为信令,是有意不包含在ORTC和WebRTC声明之中的。有很多可用于信令的机制,我们在这里就不详谈了,但是NFC,蓝牙RFCOMM,或者像示例代码中的简单的TCP套接口服务器,就足够用了。
有了SCTP传输会话建立了之后,对等端就可以打开数据通道了(DataChannel)。开启通话的一方产生一个RTCDataChannel()的示例,携带SCTP传输示例,远端参与者接收RTCSctpTransport.OnDataChannel事件。当远端参与者接收到了这个事件,数据通道就被建立起来,双方就可以发送信息给对方了。
下面一段代码是来自示例代码中的MainPage.Signaler_MessageFromPeer()。message字符串包含了通过信令接收的数据:
一旦数据通道建立了之后,远端参与者就会就会接收到OnDataChannel事件。这个事件的参数数据包括了安全的数据通道,已经打开并且准备好发送信息:
现在,你就可以自由的在对等端之间通过DataChannel交换加密的信息了。这时候就不再需要信令服务器了,所以这个连接也可以被关闭了。
通用Windows平台上的实时对等端通信能力使许多有趣的事情变为可能。我们见到过有开发者使用这项技术来激活远端参与者的HoloLens来进行实时的3D场景互动。Xbox开发者已经使用DataChannel来开发低延时的FPS游戏。还有一个我们紧密的合作伙伴,Blackboard,就依赖于这项技术给整个教室推送视频流,然后在Windows应用中聚集在一起。查看我们的通用Windows示例,以及GitHub上的数据库—我们期待着您的反馈。