Google开源实时通讯项目WebRTC

最近,Google正式开源了WebRTC实时通讯项目,但愿浏览器厂商可以将该技术内建在浏览器中,从而使Web应用开发人员可以经过HTML标签和JavaScript API就实现Web音频、视频通讯功能。html

WebRTC(Web Real Time Communication)并非Google原来本身的技术。在2010年,Google以大约6820万美圆收购了VoIP软件开发商Global IP Solutions公司,并所以得到了该公司拥有的WebRTC技术。现在,互联网的音频、视频通讯服务技术通常都是私有技术,如Skype, 须要经过安装插件或者桌面客户端来实现通讯功能。Google但愿Web开发人员可以直接在浏览器中建立视频或语音聊天应用,Global IP Solutions公司以前已经针对Android、Windows Mobile、iPhone制做了基于WebRTC的移动客户端。Google这次将WebRTC开源出来,就是但愿浏览器厂商可以将该技术直接内嵌到浏 览器中,从而方便Web开发人员。算法

WebRTC的博客说明了WebRTC的优点和发展方向:JQuery插件定义浏览器

直到如今,实时通讯仍然须要私有的信号处理技术,大部分都是经过插件和客户端来安装使用。咱们经过WebRTC开源了收购GIPS后得到的音频、视频引擎技术,让开发人员可以了解信号处理技术,并使用了BSD风格的受权。这会支持开发人员经过简单的HTML和JavaScript API建立音频和视频聊天应用。缓存

咱们正在与其余浏览器开发厂商Mozilla和Opera等紧密合做,尽快在浏览器中实现这项技术以便于Web社区使用。此外,咱们还积极地参与IETF和W3C工做组的活动,定义和实现一套实时通讯标准。网络

其官网上列表了使用WebRTC技术的四个理由:session

  1. 互联网成功的一个关键因素是一些核心技术如HTML、HTTP和TCP/IP是开放和免费实现的。目前,在浏览器通讯领域尚未免费、高质量、完整的解决方案。WebRTC就是这样的技术。
  2. 该技术已经集成了最佳的音频、视频引擎,并被部署到数以百万级的终端中,通过超过8年的磨练。Google不会从该技术中收取费用。
  3. 包含了使用STUN、ICE、TURN、RTP-over-TCP的关键NAT和防火墙穿越技术,并支持代理。
  4. 构建在浏览器中,WebRTC经过提供直接映射到PeerConnection的信号状态机来抽象信号处理。Web开发人员所以能够选择适合应用场景的协议(例如:SIP、XMPP/Jingle等等)。

WebRTC的架构图以下所示:TCSTAR7034架构

图 1  WebRTC架构图(图片来源:WebRTC官方网站)框架

关于架构图的组成部分,包括:ide

Web API——第三方开发人员用来开发基于Web的应用,如视频聊天。
WebRTC Native C++ API——浏览器厂商用于实现Web API的函数集。
Session Management——抽象session层,支持调用构建和管理层,由应用开发者来决定如何实现协议。
VoiceEngine——音频媒体链的框架,从声卡到网络。
iSAC——一种用于VoIP和流音频的宽带和超宽带音频编解码器,iSAC采用16 kHz或32 kHz的采样频率和12—52 kbps的可变比特率。
iLBC——用于VoIP和流音频的窄带语音编解码器,使用8 kHZ的采样频率,20毫秒帧比特率为15.2 kbps,30毫米帧的比特率为13.33 kbps,标准由IETF RFC 3951和3952定义。
NetEQ for Voice——动态抖动缓存和错误隐藏算法,用于缓解网络抖动和丢包引发的负面影响。在保持高音频质量的同时尽量下降延迟。
VideoEngine——视频媒体链的框架,从相机像头到网络,从网络到屏幕。
VP8——来自于WebM项目的视频编解码器,很是适合RTC,由于它是为低延迟而设计开发的。
Image enhancements——消除经过摄像头获取的图片的视频噪声等。
其余更详细的架构分析能够查看这里的文档。

PeerConnection位于WebRTC Native C++ API的最上层,它的代码实现来源于libjingle(一款p2p开发工具包),目前被应用于WebRTC中。其中关键的两个类定义是:函数

class  PeerConnectionObserver {
public:
 virtual void OnError();
 virtual void OnSignalingMessage(const std::string& msg);
 virtual void OnAddStream(const std::string& stream_id,
                          int channel_id,
                          bool video);
 virtual void OnRemoveStream(const std::string& stream_id,
                             int channel_id,
                             bool video);
};

该类定义了一个抽象的观察者。开发人员应该继承实现本身的观察者类。

class  PeerConnection {
public:
 explicit PeerConnection(const std::string& config);
 bool Initialize();
 void RegisterObserver(PeerConnectionObserver* observer);
 bool SignalingMessage(const std::string& msg);
 bool AddStream(const std::string& stream_id, bool video);
 bool RemoveStream(const std::string& stream_id);
 bool Connect();
 void Close();
 bool SetAudioDevice(const std::string& wave_in_device,
                     const std::string& wave_out_device);
 bool SetLocalVideoRenderer(cricket::VideoRenderer* renderer);
 bool SetVideoRenderer(const std::string& stream_id,
                       cricket::VideoRenderer* renderer);
 bool SetVideoCapture(const std::string& cam_device);
};

具体的函数说明能够查看相应的API介绍。

正如Google所说的,它一直在参与制定和实现HTML 5标准中的视频会议和p2p通讯部分,虽然还不是正式标准,可是咱们能够从草案的示例中看到将来Web开发人员的使用状况:

// the first argument describes the STUN/TURN server configuration
var local = new PeerConnection('TURNS example.net', sendSignalingChannel);
local.signalingChannel(...); // if we have a message from the other side, pass it along here
// (aLocalStream is some GeneratedStream object)
local.addStream(aLocalStream); // start sending video
function sendSignalingChannel(message) {
 ... // send message to the other side via the signaling channel
}
function receiveSignalingChannel (message) {
 // call this whenever we get a message on the signaling channel
 local.signalingChannel(message);
}
local.onaddstream = function (event) {
 // (videoElement is some <video> element)
 videoElement.src = URL.getObjectURL(event.stream);
};

目前有关Web实时通讯的技术标准正在制定当中,W3C的Web Real-Time Communication工做组今年五月份刚刚正式成立,并计划在今年第三季度发布第一个公开草案,从其工做组的路线图中能够看出,正式的推荐标准预计将在2013年第一季度发布,有关W3C标准是否会对WebRTC项目的发展有所影响,将来还要看草案的具体细节。

Google但愿开源的WebRTC技术可以得到愈来愈多的浏览器厂商支持,WebRTC的网站已经宣布将在Chrome、Firefox和Opera上实现相应的API接口。Opera首席技术官Håkon Wium Lie对媒体表示,Google可以把价值不菲的代码贡献出来很是了不得,Opera一直但愿可以在浏览器中实现实时通讯技术。

提到实时通讯技术,不得不让人想起行业巨头Skype。巧合的是,就在前不久,微软刚刚斥资85亿美圆现金收购网络电话服务商Skype,当时有许多分析师指出,微软的收购将直面Google的竞争:

…...收购也挫败了竞争对手Google利用Skype技术完善通话服务的计划。

MSN即时通信、必应(bing)搜索、网络广告等成了微软在互联网领域迎战谷歌的三大阵地。然而,相对于谷歌在互联网行业的呼风唤雨,微软的互联网战略一直没有真正展示出让业界看到其可以挑战谷歌的核心优点。

谷歌和苹果都已经在网络电话上投入了数年时间。苹果一直在力推iChat和FaceTime,谷歌也在普及其网络通讯相关产品Chat和 Voice。不过,谷歌和苹果都有一个共同的问题,他们很难在竞争对手的平台上生存。苹果用户没法和谷歌以及微软的用户进行视频聊天,谷歌在跨 平台方面作了不少努力,可是仍有很多障碍。

不过Skype则没有这一问题,做为免费服务的Skype能够运行在苹果、Linux以及Windows电脑上,也支持Android和iPhone等手机平台,甚至能够在电视机上运行。

收购Skype,微软不只仅是为了从中受益,微软还但愿借此使Skype远离谷歌的“魔爪”。若是谷歌收购了Skype,这对微软来讲无疑是一个沉 重的打击。想一想吧,若是谷歌收购了Skype,并将Skype整合进Google Apps、Gmail、Google Talk和Google Voice等谷歌产品之中,再想一想若是谷歌将Skype与Android平台进行一些深度整合,这对微软来讲,无疑是一场灾难。即使微软并未很好的将 Skype整合进自家产品之中,但这也避免了谷歌经过收购Skype来得到巨大的价值。

就在微软收购Skype不久,Google就宣布对WebRTC开源,这难免让人有所联想。有国外媒体评论说,Google这次开源是想让广大用户远离该行业的领导者如Skype和Apple的FaceTime平台。经过浏览器来支持实时通讯技术,Google但愿开发社区可以在本身的应用中集成该功能,从而削弱其余对手。

这已经不是Google第一次大方地开源关键项目。去年,Google曾经将VP8视频编解码项目开源,以支持HTML 5技术中的视频媒体播放。现在,多种主流浏览器都已经支持VP8格式,成为主要的多媒体格式,相比伴随着专利、付费纠纷的H.264,开放、免费的VP8 更让浏览器厂商放心。

此次WebRTC的开源会对浏览器厂商和实时通讯技术领域带来哪些影响,InfoQ中文站将持续关注和及时报道,也欢迎读者朋友发表本身的见解。