天天看點

基于webrtc多人音視訊的研究(二)

基于webrtc多人音視訊的研究

                                                                                                            之實踐篇--SFU伺服器

前言

研究webRTC斷斷續續的也有幾個年頭了,起初的興趣來自當時上學時候在開發IM(即時通訊)缺少較好的音視訊功能,開始自基于directshow自行開發的視訊傳輸,效果差強人意,更不用說應用于生産環境了。經過百般尋找,這才了解到webRTC,遂開始研究webRTC。

13年的時候貌似還沒被牆,webRTC完整下載下傳也就300m。當時實作了基于peerconnection的P2P的音視訊,後來撂下數年後在生産環境中需要跨平台的音視訊傳輸解決方案,是以才重新拾起它。此時已是15年,再想編譯其已經是無比艱難,有個好用的VPN是最基礎的工具,嘗試了數月後終于整出完整的VS2013工程(非ninja),整個工程大約9g了,當時都是很驚歎于webRTC的偉大(臃腫)。

物盡其用

webRTC,首先以web開頭,顯然是用于web端咯。這麼好的東西要是隻用于web端豈不是很可惜?它當然支援跨平!

我們來聊聊RTC都能幹點啥:

首先就是這種社交軟體、即時通訊的音視訊聊天;

其次就是ipcamera等物聯網裝置直接可以與使用者的終端通訊;

再次就是群組音視訊聊天、視訊會議;

最後還有直播、醫療等需要實時互動的領域。

我能想到的隻有這些了,但是rtc真的很強大,我還沒有真正完全的掌握它,一直處于剛剛入門級别。聽說新版本的已經支援螢幕分享了,又一大喜事。這寫無不促使我去不斷地研究這神奇的東西。

理論到實踐

好多新人還卡在怎麼實作跨平台的P2P音視訊通訊,而且這個過程很煎熬。具體技術實作我已經在前幾篇文章中提,在此不再贅述。等真正進來後發現其實還是很簡單滴。

往下看之前首先确定你已經完全掌握peerconnection的使用,甚至是實作原理,要不然請繞道而行。

                                                                            華麗的分割線                                                                            

peerconnection是WebRTC音視訊傳輸api中最基礎的一個,它是P2P傳輸音視訊流、資料流的載體。我們都知道不管是Offer端還是Answer端都需要建立一個peerconnection,然後交換sdp和candidate就能完成音視訊會話。

可是WebRTC并不提供伺服器、mixer、router等功能,要實作SFU伺服器就得自己去實作這類的功能,我們簡單的聊一下實作邏輯:

1、在服務端模拟實作peerconnection,當然你也可以用webRTC自帶的(如果你不怕太臃腫的話)。peerconnection基于ICE協定傳輸資料,這裡我選擇了libnice。從sdp裡面提取出username、password以及candidate後賦予libnice,

這樣基本上就可以打通雙方的信道開始通訊了。收到資料後,并不是裸視訊流!首先通過DTLS協定握手;确認安全後,拿到srtpRTP、srtpRTCP的user和pwd資訊。這裡提到了dtls、srtp、rtp、rtcp這四個協定,如果不懂還是先研究下。DTLS握手成功以後,ICE收到的資料就會傳遞給

srtp進行解密,解密後的資料為RTP或RTCP資料包,其中RTP承載的音視訊資料流,RTCP承載的是音視訊傳輸控制。

相反,我們要發送資料就要将上面的過程逆過來,先DTLS握手,将合成的RTP、RTCP資料包丢給srtp,加密後通過ICE發出去。

2、有了第1步的模拟操作後,我們就可以接收和發送音視訊資料流了,自然也能錄制、mixer等操作了。那我們這一步就是實作一對多的傳輸,peerconnection Sa負責接受用戶端Ca的資料,peerconnection Sb、Sc負責向用戶端Ca、Cc發送資料,那麼隻要将Sa收到的資料通過Sb、Sc發出去就能實作Ca向Cb、Cc發送音視訊資料了。當然這個過程很複雜。

3、有了這一對多的傳輸過程,那麼我們複制多次,就實作了多對多的過程。

伺服器在這裡承擔了router的功能,将每一方發過來的音視訊流分發給其他用戶端。這樣就達到了多方通話的能力。

到這裡基本的思路已經講完了,表達能力有限請多諒解。我獻上我編寫的SFU和用戶端demo,下載下傳位址

連結: https://pan.baidu.com/s/1ge9OVWB 密碼: xb6g

源碼已經開源:https://github.com/harvestsure

運作效果如圖:

基于webrtc多人音視訊的研究(二)

另外補充一句:SFU服務端和用戶端都沒有平台的限制,不局限于windows平台。本人精力和能力有限,隻能先實作這麼多,來日方長我會慢慢實作各個平台的功能。

感謝閱讀!

聲明:原csdn下載下傳url本來想賺個1積分的,誰知系統不斷修改2分、4分、5分,最後被網友噴了。見諒,上面已将url改為百度網盤連結。

繼續閱讀