最近,Google正式開源了WebRTC實(shí)時(shí)通信項(xiàng)目,希望瀏覽器廠商能夠?qū)⒃摷夹g(shù)內(nèi)建在瀏覽器中,從而使Web應(yīng)用開發(fā)人員能夠通過HTML標(biāo)簽和JavaScript API就實(shí)現(xiàn)Web音頻、視頻通信功能。
WebRTC(Web Real Time Communication)并不是Google原來自己的技術(shù)。在2010年,Google以大約6820萬美元收購(gòu)了VoIP軟件開發(fā)商Global IP Solutions公司,并因此獲得了該公司擁有的WebRTC技術(shù)。如今,互聯(lián)網(wǎng)的音頻、視頻通信服務(wù)技術(shù)一般都是私有技術(shù),如Skype, 需要通過安裝插件或者桌面客戶端來實(shí)現(xiàn)通信功能。Google希望Web開發(fā)人員能夠直接在瀏覽器中創(chuàng)建視頻或語音聊天應(yīng)用,Global IP Solutions公司之前已經(jīng)針對(duì)Android、Windows Mobile、iPhone制作了基于WebRTC的移動(dòng)客戶端。Google此次將WebRTC開源出來,就是希望瀏覽器廠商能夠?qū)⒃摷夹g(shù)直接內(nèi)嵌到瀏 覽器中,從而方便Web開發(fā)人員。
WebRTC的博客說明了WebRTC的優(yōu)勢(shì)和發(fā)展方向:
直到現(xiàn)在,實(shí)時(shí)通信仍然需要私有的信號(hào)處理技術(shù),大部分都是通過插件和客戶端來安裝使用。我們通過WebRTC開源了收購(gòu)GIPS后獲得的音頻、視頻引擎技術(shù),讓開發(fā)人員能夠了解信號(hào)處理技術(shù),并使用了BSD風(fēng)格的授權(quán)。這會(huì)支持開發(fā)人員通過簡(jiǎn)單的HTML和JavaScript API創(chuàng)建音頻和視頻聊天應(yīng)用。
我們正在與其他瀏覽器開發(fā)廠商Mozilla和Opera等緊密合作,盡快在瀏覽器中實(shí)現(xiàn)這項(xiàng)技術(shù)以便于Web社區(qū)使用。此外,我們還積極地參與IETF和W3C工作組的活動(dòng),定義和實(shí)現(xiàn)一套實(shí)時(shí)通信標(biāo)準(zhǔn)。
其官網(wǎng)上列表了使用WebRTC技術(shù)的四個(gè)理由:
- 互聯(lián)網(wǎng)成功的一個(gè)關(guān)鍵因素是一些核心技術(shù)如HTML、HTTP和TCP/IP是開放和免費(fèi)實(shí)現(xiàn)的。目前,在瀏覽器通信領(lǐng)域還沒有免費(fèi)、高質(zhì)量、完整的解決方案。WebRTC就是這樣的技術(shù)。
- 該技術(shù)已經(jīng)集成了最佳的音頻、視頻引擎,并被部署到數(shù)以百萬級(jí)的終端中,經(jīng)過超過8年的磨練。Google不會(huì)從該技術(shù)中收取費(fèi)用。
- 包含了使用STUN、ICE、TURN、RTP-over-TCP的關(guān)鍵NAT和防火墻穿越技術(shù),并支持代理。
- 構(gòu)建在瀏覽器中,WebRTC通過提供直接映射到PeerConnection的信號(hào)狀態(tài)機(jī)來抽象信號(hào)處理。Web開發(fā)人員因此可以選擇適合應(yīng)用場(chǎng)景的協(xié)議(例如:SIP、XMPP/Jingle等等)。
WebRTC的架構(gòu)圖如下所示:

圖 1 WebRTC架構(gòu)圖(圖片來源:WebRTC官方網(wǎng)站)
關(guān)于架構(gòu)圖的組成部分,包括:
Web API——第三方開發(fā)人員用來開發(fā)基于Web的應(yīng)用,如視頻聊天。
WebRTC Native C++ API——瀏覽器廠商用于實(shí)現(xiàn)Web API的函數(shù)集。
Session Management——抽象session層,支持調(diào)用構(gòu)建和管理層,由應(yīng)用開發(fā)者來決定如何實(shí)現(xiàn)協(xié)議。
VoiceEngine——音頻媒體鏈的框架,從聲卡到網(wǎng)絡(luò)。
iSAC——一種用于VoIP和流音頻的寬帶和超寬帶音頻編解碼器,iSAC采用16 kHz或32 kHz的采樣頻率和12—52 kbps的可變比特率。
iLBC——用于VoIP和流音頻的窄帶語音編解碼器,使用8 kHZ的采樣頻率,20毫秒幀比特率為15.2 kbps,30毫米幀的比特率為13.33 kbps,標(biāo)準(zhǔn)由IETF RFC 3951和3952定義。
NetEQ for Voice——動(dòng)態(tài)抖動(dòng)緩存和錯(cuò)誤隱藏算法,用于緩解網(wǎng)絡(luò)抖動(dòng)和丟包引起的負(fù)面影響。在保持高音頻質(zhì)量的同時(shí)盡可能降低延遲。
VideoEngine——視頻媒體鏈的框架,從相機(jī)像頭到網(wǎng)絡(luò),從網(wǎng)絡(luò)到屏幕。
VP8——來自于WebM項(xiàng)目的視頻編解碼器,非常適合RTC,因?yàn)樗菫榈脱舆t而設(shè)計(jì)開發(fā)的。
Image enhancements——消除通過攝像頭獲取的圖片的視頻噪聲等。
其他更詳細(xì)的架構(gòu)分析可以查看這里的文檔。
PeerConnection位于WebRTC Native C++ API的最上層,它的代碼實(shí)現(xiàn)來源于libjingle(一款p2p開發(fā)工具包),目前被應(yīng)用于WebRTC中。其中關(guān)鍵的兩個(gè)類定義是:
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);
};
該類定義了一個(gè)抽象的觀察者。開發(fā)人員應(yīng)該繼承實(shí)現(xiàn)自己的觀察者類。
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);
};
具體的函數(shù)說明可以查看相應(yīng)的API介紹。
正如Google所說的,它一直在參與制定和實(shí)現(xiàn)HTML 5標(biāo)準(zhǔn)中的視頻會(huì)議和p2p通信部分,雖然還不是正式標(biāo)準(zhǔn),但是我們可以從草案的示例中看到未來Web開發(fā)人員的使用情況:
// 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);
};
目前有關(guān)Web實(shí)時(shí)通信的技術(shù)標(biāo)準(zhǔn)正在制定當(dāng)中,W3C的Web Real-Time Communication工作組今年五月份剛剛正式成立,并計(jì)劃在今年第三季度發(fā)布第一個(gè)公開草案,從其工作組的路線圖中可以看出,正式的推薦標(biāo)準(zhǔn)預(yù)計(jì)將在2013年第一季度發(fā)布,有關(guān)W3C標(biāo)準(zhǔn)是否會(huì)對(duì)WebRTC項(xiàng)目的發(fā)展有所影響,未來還要看草案的具體細(xì)節(jié)。
Google希望開源的WebRTC技術(shù)能夠獲得越來越多的瀏覽器廠商支持,WebRTC的網(wǎng)站已經(jīng)宣布將在Chrome、Firefox和Opera上實(shí)現(xiàn)相應(yīng)的API接口。Opera首席技術(shù)官Håkon Wium Lie對(duì)媒體表示,Google能夠把價(jià)值不菲的代碼貢獻(xiàn)出來非常了不起,Opera一直希望能夠在瀏覽器中實(shí)現(xiàn)實(shí)時(shí)通信技術(shù)。
提到實(shí)時(shí)通信技術(shù),不得不讓人想起行業(yè)巨頭Skype。巧合的是,就在前不久,微軟剛剛斥資85億美元現(xiàn)金收購(gòu)網(wǎng)絡(luò)電話服務(wù)商Skype,當(dāng)時(shí)有許多分析師指出,微軟的收購(gòu)將直面Google的競(jìng)爭(zhēng):
…...收購(gòu)也挫敗了競(jìng)爭(zhēng)對(duì)手Google利用Skype技術(shù)完善通話服務(wù)的計(jì)劃。
MSN即時(shí)通訊、必應(yīng)(bing)搜索、網(wǎng)絡(luò)廣告等成了微軟在互聯(lián)網(wǎng)領(lǐng)域迎戰(zhàn)谷歌的三大陣地。然而,相對(duì)于谷歌在互聯(lián)網(wǎng)行業(yè)的呼風(fēng)喚雨,微軟的互聯(lián)網(wǎng)戰(zhàn)略一直沒有真正展現(xiàn)出讓業(yè)界看到其能夠挑戰(zhàn)谷歌的核心優(yōu)勢(shì)。
谷歌和蘋果都已經(jīng)在網(wǎng)絡(luò)電話上投入了數(shù)年時(shí)間。蘋果一直在力推iChat和FaceTime,谷歌也在普及其網(wǎng)絡(luò)通信相關(guān)產(chǎn)品Chat和Voice。不過,谷歌和蘋果都有一個(gè)共同的問題,他們很難在競(jìng)爭(zhēng)對(duì)手的平臺(tái)上生存。蘋果用戶無法和谷歌以及微軟的用戶進(jìn)行視頻聊天,谷歌在跨 平臺(tái)方面做了很多努力,但是仍有不少障礙。
不過Skype則沒有這一問題,作為免費(fèi)服務(wù)的Skype可以運(yùn)行在蘋果、Linux以及Windows電腦上,也支持Android和iPhone等手機(jī)平臺(tái),甚至可以在電視機(jī)上運(yùn)行。
收購(gòu)Skype,微軟不僅僅是為了從中受益,微軟還希望借此使Skype遠(yuǎn)離谷歌的“魔爪”。如果谷歌收購(gòu)了Skype,這對(duì)微軟來說無疑是一個(gè)沉重的打擊。想想吧,如果谷歌收購(gòu)了Skype,并將Skype整合進(jìn)Google Apps、Gmail、Google Talk和Google Voice等谷歌產(chǎn)品之中,再想想如果谷歌將Skype與Android平臺(tái)進(jìn)行一些深度整合,這對(duì)微軟來說,無疑是一場(chǎng)災(zāi)難。即便微軟并未很好的將Skype整合進(jìn)自家產(chǎn)品之中,但這也避免了谷歌通過收購(gòu)Skype來獲得巨大的價(jià)值。
就在微軟收購(gòu)Skype不久,Google就宣布對(duì)WebRTC開源,這不免讓人有所聯(lián)想。有國(guó)外媒體評(píng)論說,Google此次開源是想讓廣大用戶遠(yuǎn)離該行業(yè)的領(lǐng)導(dǎo)者如Skype和Apple的FaceTime平臺(tái)。通過瀏覽器來支持實(shí)時(shí)通信技術(shù),Google希望開發(fā)社區(qū)能夠在自己的應(yīng)用中集成該功能,從而削弱其他對(duì)手。
這已經(jīng)不是Google第一次大方地開源關(guān)鍵項(xiàng)目。去年,Google曾經(jīng)將VP8視頻編解碼項(xiàng)目開源,以支持HTML 5技術(shù)中的視頻媒體播放。如今,多種主流瀏覽器都已經(jīng)支持VP8格式,成為主要的多媒體格式,相比伴隨著專利、付費(fèi)糾紛的H.264,開放、免費(fèi)的VP8更讓瀏覽器廠商放心。
這次WebRTC的開源會(huì)對(duì)瀏覽器廠商和實(shí)時(shí)通信技術(shù)領(lǐng)域帶來哪些影響,InfoQ中文站將持續(xù)關(guān)注和及時(shí)報(bào)道,也歡迎讀者朋友發(fā)表自己的看法。