WebRTC(Web Real-Time Communication,網頁即時通信),是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術,目的是無插件實現web端的實時通信的能力。WebRTC提供了視頻會議的核心技術,包括音視頻的採集、編解碼、網絡傳輸、展示等功能,並且還支持跨平臺,包括linux、windows、mac、android等。
2010 年 Google 以 6820 萬美元收購 VoIP 軟件開發商 Global IP Solutions 的 GIPS 引擎,在經過收購之後沒多久,Google 將該引擎改名為“WebRTC”,並宣佈向開發者們開源了源代碼。
2012 年,Google 將 WebRTC 集成到 Chrome 瀏覽器中。隨後, Mozilla、Opera、Ericsson 等 PC 瀏覽器以及手機瀏覽器均開始支持 WebRTC 技術。
2017 年,蘋果在 WWDC17 上正式宣佈其瀏覽器內核 WebKit 也正式支持 WebRTC。
基於 Chromium 的新版 Edge 現在可在預覽版中使用。新版本的 Edge 提供了 WebRTC 開發者常用的許多功能,如支持數據通道、RTCPeerConnection 中的 Strem、VP9 編解碼器和 MediaStream Recording。
在 Discord、Google Hangouts 和 Facebook Messenger 等一些國內的多媒體網絡應用中,也都需要 WebRTC 才能實現。
但是,WebRTC 的發展還面臨著諸多的挑戰:
瀏覽器面臨的主要挑戰是完成 WebRTC 1.0 API 的實現,以及消除實現差異。WebRTC API 在其歷史中經歷了三次主要迭代,需要實現互操作性、改進測試覆蓋率等方面的標準。W3C 在實現這一目標方面一直在穩步前進,但還未成熟。
前實時音視頻通信領域,也並不只有 WebRTC 一種可供選擇的技術,專有的自研協議和 WebRTC 的互操作性通常使用網關實現。
WebRTC協議介紹:https://www.cnblogs.com/SingleCat/p/11315349.html
基於Webrtc、Kurento的一種低延遲架構實現:https://www.jianshu.com/p/ac307371def4
WebRTC的開源實現:
1、Jitsi Videobridge
Jitsi是一個SFU開源框架,由Atlassian維護,被集成到HipChat中。
Jitsi是一個處理XMPP信號流的SFU,適用於SIP/XMPP視頻通話,會議,聊天,桌面共享,文件傳輸。如果你不需要SFU或者使用其他信號協議,最好還是使用其他項目。但由於Jitsi項目的簡單明瞭,很多外包供應商很喜歡使用Jitsi,將它集成到自己的項目案例當中。
Github項目地址:https://github.com/jitsi/jitsi
2、Kurento
Kurento 是一個 WebRTC 流媒體服務器以及一些客戶端API,可以實現webrtc mcu、sfu等功能。2016年被Twilio收購,Kurento目前推進到6.13版本。nubomedia 開源框架是基於kurento開發的官方paas 平臺,提高了穩定性,但是並不推薦學習使用。它可以實現的功能包括
- 網絡流媒體協議,包括HTTP、RTP和WebRTC
- 群組通信(group communications,包括MCU和SFU功能),支持媒體流的轉碼、錄製、廣播、路由、混流。
- 高級媒體處理特性,包括:機器視覺、視頻索引、增強現實、語音分析。
- Media storage that supports writing operations for WebM and MP4 and playing in all formats supported by GStreamer.
- Automatic media transcoding between any of the codecs supported by GStreamer, including VP8, H.264, H.263, AMR, OPUS, Speex, G.711, and more.
官網地址:http://www.kurento.org
2019年12月發佈的最新的6.13版本的文檔:https://doc-kurento.readthedocs.io/en/6.13.0/project/relnotes/v6_13_0.html
由於Kurento開源服務只有Ubuntu的版本,所以在WSL的UBUNTU上安裝Kurento服務器是再適合不過了。建議安裝Kurento的6.11版本,因為最新的版本並不支持kms-datachannelexample等組件,無法運行顯示字幕等實例,如果只是學習WebRTC,可以無視。
6.11版本的文檔https://doc-kurento.readthedocs.io/en/6.11.0/user/about.html
WSL上的安裝:
1、 在Ubuntu子系統內確認安裝GnuPG
<code>sudo apt-get update && sudo apt-get install --no-install-recommends --yes \\
gnupg/<code>
2、 在16.04的Ubuntu子系統,執行:
<code> DISTRO="xenial" # KMS for Ubuntu 16.04 (Xenial)
DISTRO="bionic" # KMS for Ubuntu 18.04 (Bionic)
/<code>
在18.04的Ubuntu子系統,執行
<code>DISTRO="bionic" # KMS for Ubuntu 18.04 (Bionic)/<code>
3、下面兩條指令指令增加Kurento倉庫到系統配置中:
<code>sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 5AFA7A83
sudo tee "/etc/apt/sources.list.d/kurento.list" >/dev/null <# Kurento Media Server - Release packages /<code>
deb [arch=amd64] http://ubuntu.openvidu.io/6.13.0 $DISTRO kms6
EOF
4、 安裝Kurento服務KMS
<code>sudo apt-get update && sudo apt-get install --yes kurento-media-server/<code>
安裝過程中下載較慢,特別是下載GStream組件的時候,如果下載速度降到很低,可以中斷重新下載,具備斷點重傳。
5、安裝完成後,可以用下面的指令啟動服務,或者停止服務
<code>sudo service kurento-media-server start
sudo service kurento-media-server stop/<code>
KMS會在Ubuntu子系統本地生成一個端口在8888的服務,可以通過/etc/kurento/kurento.conf.json進行KMS的詳細配置。
6、可以在/var/log /kurento-media-server/下查看KMS的日誌信息
7、如果需要在遠程服務器上部署KMS服務,則需要繼續安裝STUN或者TURN服務器,來穿透NAT牆。可以參照該網文來安裝Docker設置,https://blog.csdn.net/XRRRICK/article/details/85010829
8、之後可以繼續下載Kurento的示例代碼來安裝運行,有SpringBoot、NodeJS等版本的程序供選擇。我這裡用SpringBoot就是Java的例程:Kurento Java Tutorial - Hello World
(1) 運行以下命令來下載Java實例代碼、設置6.11分支,打包運行SpringBoot項目:
<code>git clone https://github.com/Kurento/kurento-tutorial-java.git
cd kurento-tutorial-java/kurento-hello-world
git checkout 6.11.0
mvn -U clean spring-boot:run -Dkms.url=ws://localhost:8888/kurento/<code>
這裡的-Dkms.url=ws://localhost:8888/kurento是本地KMS服務提供的路徑,如果端口沒有什麼變化,可以省略不寫。
(2) 如果啟動沒有什麼錯誤的話,就可以在WebRTC兼容的瀏覽器(Chrome、Edge、360瀏覽器等)輸入以下地址(注意是https協議):https://localhost:8443/,這個Helloworld實例是將本地攝像頭採集到的音視頻流發送到KMS服務器後,又回送到瀏覽器,左邊的Video組件是顯示本地的視頻,右邊的Video組件是顯示回送的視頻。
可以看到界面:
在界面的console裡你可以看到整個瀏覽器客戶端與應用服務器(SpringBoot創建的8433端口的Web服務)的消息協商過程。
如果在Chrome瀏覽器中,可以在瀏覽器的另一個標籤裡打開:chrome://webrtc-internals/,可以看到Google瀏覽器提供的對WebRTC數據的統計。
有興趣的同學可以摘取其中的靜態JS文件和庫文件,組合到自己的應用裡。
- 示例中的WebRTC Media Player可以修改為遠程流媒體播放。
- 示例中的WebRTC recording可以修改為流媒體錄像
- 示例中的WebRTC One-To-Many broadcast可以修改為一對多的直播
- 示例中的WebRTC Many-To-Many video call (Group Call) 可以修改為多對多的視頻會議系統
可以在我的網站rtc目錄下訪問這個helloworld示例,rtc/hello.html
閱讀更多 北郵杜老師 的文章