1、概述
本文來自騰訊視頻雲終端技術總監rexchang(常青)技術分享,內容分別介紹了微信小程序視音視頻和WebRTC的技術特征、差異等,並針對兩者的技術差異分享和總結了微信小程序視音視頻和WebRTC互通的實現思路以及技術方案。希望能帶給你啟發。
學習交流:
- 即時通訊開發交流3群:185926912[推薦]
- 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM》
(本文同步發布於:http://www.52im.net/thread-1988-1-1.html)
2、關於作者

rexchang(常青):騰訊視頻雲終端技術總監,2008 年畢業加入騰訊,一直從事客戶端研發相關工作,先后參與過 PC QQ、手機QQ、QQ物聯 等產品項目,目前在騰訊視頻雲團隊負責音視頻終端解決方案的優化和落地工作。(常青的另一篇分享你可能也感興趣:《騰訊技術分享:微信小程序音視頻技術背后的故事》)
3、相關文章
微信團隊分享的音視頻技術文章:
有關WebRTC的技術文章:
《訪談WebRTC標准之父:WebRTC的過去、現在和未來》
《良心分享:WebRTC 零基礎開發者教程(中文)[附件下載]》
《新手入門:到底什么是WebRTC服務器,以及它是如何聯接通話的?》
《[觀點] WebRTC應該選擇H.264視頻編碼的四大理由》
《基於開源WebRTC開發實時音視頻靠譜嗎?第3方SDK有哪些?》
《開源實時音視頻技術WebRTC中RTP/RTCP數據傳輸協議的應用》
《開源實時音視頻技術WebRTC在Windows下的簡明編譯教程》
《網頁端實時音視頻技術WebRTC:看起來很美,但離生產應用還有多少坑要填?》
《了不起的WebRTC:生態日趨完善,或將實時音視頻技術白菜化》
>> 更多同類文章 ……
4、分別介紹一下小程序音視頻和WebRTC
小程序音視頻是什么?

2017年騰訊視頻雲團隊跟微信團隊聯合,將視頻雲 SDK 跟微信小程序整合在一起,並通過 <live-pusher> 和 <live-player> 兩個標簽的形式開放內部的功能。通過這兩個標簽,開發者可以實現在線直播、低延時監控、雙人視頻通話以及多人視頻會議等功能。
微信小視頻音視頻技術的由來,請看這篇:《騰訊技術分享:微信小程序音視頻技術背后的故事》。
那么WebRTC又是什么?

WebRTC(Web Real-Time Communication),是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術,是谷歌收購 GIPS 公司而獲得的一項技術,在 Chrome 瀏覽器上無需安裝插件,通過 javascript 就可以編寫實時音視頻通話程序。
想了解更多WebRTC工程的背后,請閱讀:《訪談WebRTC標准之父:WebRTC的過去、現在和未來》。
5、微信小程序音視頻和WebRTC的區別在哪里?
如果您跟我一樣是一個實用主義者,那我就簡單從實用主義角度說一下我的結論:小程序音視頻搞定了手機,WebRTC拿下了PC。
如果你對技術比較感興趣,那我們就可以從多個技術的角度去列舉兩者的區別,下面是一張詳細對比的表格:

實現原理:
小程序音視頻是將騰訊視頻雲的 liteavsdk 嵌入到微信內部實現的,然后通過 <live-pusher> 和 <live-player> 兩個標簽將 SDK 內部的音視頻能力開放出來。所以小程序的標簽起到了開發者 API 的作用,而內部的 SDK 則是真正用來實現音視頻功能。
WebRTC 由谷歌收購 GIPS 得來(這里不得不提一下,我加入騰訊時所在的第一個團隊就是 QQ 團隊,當時 QQ 的音視頻還是購買的 GIPS 公司的產品,不過由於各種不靠譜,后來就轉為自研路線了)。所以其技術被完整的保留並且加入到了 Google 的 Chrome 瀏覽器內核當中。而且最近蘋果也已經開始在 Safari 瀏覽器中支持 WebRTC 的相關能力。
底層協議:
小程序音視頻的主要協議是目前在直播領域最為常用的 RTMP 推流協議,以及 HTTP-FLV 播放協議,這兩種協議都已經有多年的沉淀而且在互聯網上的資料也是汗牛充棟。
WebRTC的底層則是使用RTP和RTCP兩種數據協議,其中RTP主要用於音視頻數據傳輸,而RTCP則一般用於控制。
移動端碎片化問題:
小程序音視頻由於是微信統一實現的,而且微信團隊每個版本都盡量要求功能對齊,否則寧可不上,所以在碎片化問題上基本不存在。
WebRTC在這里則要尷尬的多,一方面Android系統的碎片化本身讓WebRTC的具體表現呈現“百花齊放”的景象,同時,iOS 目前的內嵌WebView(也就是在微信等APP里打開的各種內嵌網頁)不支持WebRTC也還是個很麻煩的問題。
擴展性:
小程序音視頻跟隨微信的版本發布,有什么問題一般是當前代碼流修正,然后跟隨下一個版本發布,所以一般一個功能點(比如給 pusher 加一個美顏的功能)或者一個問題點(比如不支持手勢放大)從確立到最終實現(或解決)僅需要一個月的時間,而且微信APP新版本的覆蓋速度也確實挺快。
相比之下,WebRTC則不是一個團隊或者一家公司的問題了,因為它現在已經走標准路線,所以每一個新特性都是先確定標准,然后再推動瀏覽器廠商(包括蘋果)進行跟隨。這里面的故事就多了,時間也就更久了。
桌面瀏覽器支持:
相信您已經發現,在前面幾個問題的分析上,我的觀點都傾向小程序音視頻。確實,在目前國內的移動領域里,谷歌和蘋果都不能一家說了算,真正說了算的還是微信。
但是在桌面瀏覽器這個部分,Chrome目前在PC瀏覽器市場上留到地位的存在決定了 WebRTC 的優勢就很大了,開發者可以在不安裝插件的情況下就可以實現自己想要的功能。
相比之下,由於沒有 Chrome 的原生支持,所以如果我們要在 PC 上對接小程序音視頻,就需要安裝瀏覽器插件或者通過 wxlite://start 這樣的偽協議喚起本地 exe 應用程序(類似在網頁上打開 QQ 聊天窗口)。
6、微信小程序音視頻和WebRTC並非零和博弈
小程序音視頻和WebRTC支架並非零和博藝,雙方都有自己的優勢和不足,所以本着“打不過他們,就加入他們”的思路,騰訊視頻雲團隊在2018年春節回來后,就馬不停蹄地開始了小程序音視頻和WebRTC互通的相關工作。
目前,需要向各位開發者匯報的是,在最新版本的微信中,小程序音視頻已經可以跟WebRTC打通,目前在PC 的Chrome瀏覽器上就可以跟小程序進行實時音視頻互通。
7、知己知彼,充分了解WebRTC
就像結婚一樣,既然你決定要選擇另一個人作為人生下半輩子的伴侶,那你肯定會先深入地了解一下TA這個人,比如性格,脾氣,愛好等各個方面。
同樣,我們要想很好的將小程序音視頻和WebRTC打通,那也必須要多了解一下WebRTC,這里我就說一下我對 WebRTC 這個“人” 在性格上的一些理解。
首先,她雖然長得不太好看,但很有內涵:
說WebRTC長得不好看,只是我的一種比喻,我的意思是想說WebRTC的學習成本不低,雖然Google做了很多淺顯易懂的PPT來教你怎么 Getting Start,但真要完整的學進去,還是需要靜下心來,慢慢地把她當成自己認可的目標去學下去。但是如果你是第一次戀愛(也就是第一次接觸實時音視頻),你會發現學習WebRTC的過程,本身就是了解一個實時音視頻技術細節的過程。
其次,她非常喜歡遷就別人,各種架構方案她都能支持到:
說WebRTC喜歡遷就比人,也是一種比喻,WebRTC所支持的后台架構非常多(比如 Mixer, Mesh,Router),而且谷歌認為這些后台實現都比較簡單,所以既沒有開放后台相關的源碼,也沒有提供統一的后台解決方案。這種開放式的設計思路非常好,但副作用就是實現成本高。在真刀真槍的項目落地時,小規模的公司或者開發者就很容易被這種技術門檻擋在門外。尤其是想要將 WebRTC 真正應用到企業級解決方案中,面對錄制和存檔的剛性需求,就需要花費大量時間進行定制開發。
8、微信小程序音視頻和WebRTC互通方案的確立
了解到 WebRTC 的這些特點后,我們的互通方案也就比較清晰了:
1)首先,小程序音視頻的特點是接口簡單,快速上手,這是小程序的優勢;而這一點恰恰是WebRTC的劣勢,所以我們沒有必要在小程序端為WebRTC暴露十幾個接口類,而是繼續采用小程序音視頻的 和 標簽來解決問題;
2)其次,WebRTC 的后台沒有官方實現,那就意味着這里有很大的發揮空間,騰訊視頻雲就可以實現一套WebRTC后台並將其同小程序音視頻所使用RTMP后台進行打通。簡單來說,騰訊視頻雲要在小程序音視頻和WebRTC之間充當紅娘(更確切的說,應該是翻譯員)的角色。
但是看過《新聞聯播》里國家領導人之間談話鏡頭的人都知道,這種翻譯是會影響交流速度的。小程序音視頻和WebRTC之間互通,中間引入一個翻譯員,是不是通訊延時也就增加了?
其實不會,因為小程序音視頻和WebRTC的視頻編碼標准在常規應用場景中是一致的,都是H.264標准,這是音頻格式不同而已。這就意味着,翻譯員要做的事情很少,兩邊基本都能挺對對方在說什么,所以延時不會增加太多。
9、微信小程序音視頻和WebRTC的成功握手
下圖所展示的就是本次互通問題上所采取的方案:

如上圖所示,本次互通方案的原理如下:
1)首先,微信端的小程序通過騰訊視頻雲SDK將音視頻流推送到騰訊雲 RTMP 服務器;
2)其次,騰訊雲 RTMP 服務器的會對音視頻數據進行初步的轉化處理,然后透傳給騰訊視頻雲的實時音視頻后台集群;
3)再次,實時音視頻后台會再次將數據交給一個叫做 WebRTC-Proxy 的模塊,就在這里, WebRTC-Proxy 要將來自小程序音視頻的音視頻數據翻譯成 WebRTC 理解的“語言”;
4)最后,在PC上的Chrome瀏覽器,就可以通過瀏覽器內置的WebRTC模塊跟 WebRTC-Proxy 通訊,進而看到小程序端的視頻影像;
5)上面的四個過程倒過來,就可以實現雙向視頻通話;而將騰訊視頻雲作為星型結構的中心節點,多個端(不管是小程序還是Chrome瀏覽器)都接入進來,那就可以形成多人音視頻解決方案。
10、微信小程序音視頻和WebRTC打通房間邏輯
僅僅完成了音視頻數據在小程序和WebRTC之間的握手還遠遠不夠,因為在一次成功的音視頻通話背后,不僅僅是把一端的音視頻數據傳遞到另一端這么簡單,還有狀態的同步和成員間的狀態協同。
比如多人視頻通話中,涉及到呼叫和接通的流程,其中一方如果掛斷了,其他人要收到掛斷的通知。同時,如果有新的參與者加入,那么其他人也要收到相應的通知。WebRTC 中有很多組件,比如 RTCPeerConnection 就在處理上訴林林種種的邏輯。但是 WebRTC 的接口中引入的新名詞非常多,對於初學者來說還是有一定的入門門檻,為了簡化這里的邏輯,我們引入一個叫做“房間”的概念。
所謂房間(Room),就是把同時參與視頻通話的各方圈在一起的一個東西。比如雙人通話中,通話中的兩個人 A 和 B 就可以認為在一個房間中。再比如在多人通話中,通話中的五個人(A B C D E)也可以認為是在一個房間里。
有了房間的概念,那我們就可以對剛才說的狀態協同用兩個簡單的動作描述一下:如果有一個人加入了視頻通話,那么就可以理解為他/她已經進房(EnterRoom)了;如果有一個退出了視頻通話,那么就可以理解為他/她已經離開房間(LeaveRoom)了。而房間的門板上始終寫着:“目前在房間里有哪幾個人”。
有了房間的概念,我們就可以將小程序的兩個簡單的 <live-pusher> 和 <live-player> 標簽,同 WebRTC 那一套復雜的 API 進行功能上的對齊,我們甚至不需要修改我們在第一版中定義的接口,就可以達成這個目標:

如上圖所示,原理如下:
1) 的 url 接口不再傳遞 rtmp:// 協議的推流地址,而是傳遞 room:// 協議的推流地址。room:// 協議的使用方式可以參考我們的原理版文檔DOC。;
2)<live-pusher> 標簽在 start 成功之后,就相當於成功進入一個 room,之后,您可以通過 onPushEvent (PUSH_EVT_ROOM_USERLIST = 1020) 事件,收到房間里還有那些人的信息。在視頻通話期間,房間內各個成員的進進出出,也都會通過這個事件通知給您的小程序代碼;
3)ROOM_USERLIST 里每一項都是一個二元組(如果是 1v1 的視頻通話,ROOM_USERLIST 里只會有一個人): userid 和 playurl。 userid 代表是哪個用戶, playurl 則是這個用戶遠程畫面的播放地址。您要做的只是使用 <live-player> 標簽播放這些遠程畫面的圖像和聲音而已;
4)在 WebRTC 這一端,您可以參考我們的 webrtc API,這套 API 相對於 WebRTC 原生的 API,更適合初學者使用。
11、來看看最終的接入效果
如果您希望一天內就打通 webrtc 和 小程序音視頻 的互通,那么我推薦您不要從零開始,因為那會耗費您太多時間去踩坑和 bugfix,推薦您直接使用我們封裝好的 <webrtc-room> ,這套方案既可以幫助您完成快速接入,又能滿足一定的定制需求。
本次方案的最終接入效果,可以在從“微信=>發現=>小程序=>騰訊雲視頻雲”,體驗騰訊雲官方 Demo 中的 WebRTC 互通效果:

標簽說明:
標簽是基於 和 實現的用於 WebRTC 互通的自定義組件。如果您希望直接使用 和 標簽完成對接,或者想要了解 的內部原理,可以參考 DOC。
版本要求:
微信 6.6.6 版本開始支持。
效果演示:
1)PC 端:用 Chrome 瀏覽器打開 體驗頁面 可以體驗桌面版 WebRTC 的效果;
2)微信端:發現=>小程序=>搜索“騰訊視頻雲”,點擊 WebRTC 功能卡,就可以體驗跟桌面版 Chrome 互通的效果了。
對接資料:
1)小程序源碼(包含<webrtc-room>的組件源碼以及demo源碼);
2)PC端源碼(基於Webrtc API實現的Chrome版WebRTC接入源碼(其中 component/WebRTCRoom.js 實現了一個簡單的房間管理功能,component/mainwindow.js包含了對 WebRTC API 的使用代碼));
3)后台源碼(實現了一個簡單的房間列表功能,同時包含<webrtc-room>幾個所需參數的生成代碼)。
附錄:更多音視頻技術文章匯總
《即時通訊音視頻開發(五):認識主流視頻編碼技術H.264》
《即時通訊音視頻開發(九):實時語音通訊的回音及回音消除概述》
《即時通訊音視頻開發(十):實時語音通訊的回音消除技術詳解》
《即時通訊音視頻開發(十一):實時語音通訊丟包補償技術詳解》
《即時通訊音視頻開發(十三):實時視頻編碼H.264的特點與優勢》
《即時通訊音視頻開發(十五):聊聊P2P與實時音視頻的應用情況》
《即時通訊音視頻開發(十六):移動端實時音視頻開發的幾個建議》
《即時通訊音視頻開發(十七):視頻編碼H.264、VP8的前世今生》
《學習RFC3550:RTP/RTCP實時傳輸協議基礎知識》
《基於RTMP數據傳輸協議的實時流媒體技術研究(論文全文)》
《還在靠“喂喂喂”測試實時語音通話質量?本文教你科學的評測方法!》
《實現延遲低於500毫秒的1080P實時音視頻直播的實踐分享》
《技術揭秘:支持百萬級粉絲互動的Facebook實時視頻直播》
《理論聯系實際:實現一個簡單地基於HTML5的實時視頻直播》
《首次披露:快手是如何做到百萬觀眾同場看直播仍能秒開且不卡頓的?》
《騰訊音視頻實驗室:使用AI黑科技實現超低碼率的高清實時視頻聊天》
《七牛雲技術分享:使用QUIC協議實現實時視頻直播0卡頓!》
《實時視頻直播客戶端技術盤點:Native、HTML5、WebRTC、微信小程序》
《微信多媒體團隊訪談:音視頻開發的學習、微信的音視頻技術和挑戰等》
《以網游服務端的網絡接入層設計為例,理解實時通信的技術挑戰》
《騰訊技術分享:微信小程序音視頻與WebRTC互通的技術思路和實踐》
>> 更多同類文章 ……
(本文同步發布於:http://www.52im.net/thread-1988-1-1.html)