開發(fā) JavaScript 視頻聊天軟件APP

言鼎科技 04-18 341

“WebRTC 預計將以 34.37% 的復合年增長率增長,到 2031 年市場價值將超過 3000 億美元”

近年來,許多企業(yè)開始在網(wǎng)上開展業(yè)務(wù)。他們使用視頻聊天軟件APP作為與客戶和其他企業(yè)聯(lián)系的重要工具。

如果您是這樣的企業(yè)或個人,希望創(chuàng)建視頻聊天軟件APP,那么本文適合您。在本文中,我將引導您完成使用 JavaScript 和 WebRTC 點對點連接創(chuàng)建視頻聊天軟件APP的步驟。

讓我們開始吧!

什么是WebRTC?

WebRTC 是一個在瀏覽器中啟用實時通信 (RTC) 功能的框架。它允許在沒有任何服務(wù)器的情況下進行點對點通信。它允許客戶端之間直接交換音頻、視頻和聊天數(shù)據(jù)。

webrtc視頻通話API

為什么將 WebRTC 用于通信軟件APP?

人們使用 Whatsapp、Signal 和 Telegram 等流行的聊天軟件APP進行業(yè)務(wù)溝通。但專用的電子會議軟件APP與簡單的聊天系統(tǒng)在不同方面有所不同。

要為您的企業(yè)開發(fā)這樣的軟件APP,首先您需要了解視頻聊天的工作原理。

讓我用一個簡單的例子來解釋這一點。想象一下您正在開發(fā)一個網(wǎng)絡(luò)視頻聊天軟件APP?,F(xiàn)在,您需要 2 個瀏覽器(客戶端)——一個調(diào)用者和一個被調(diào)用者。要連接呼叫者和被呼叫者設(shè)備,您需要中間有一個服務(wù)器。該服務(wù)器將負責在兩個瀏覽器之間交換消息。

一般來說,這是很耗時的。這意味著,視頻/語音數(shù)據(jù)必須從呼叫者客戶端傳輸?shù)椒?wù)器。然后服務(wù)器必須將數(shù)據(jù)傳遞給被調(diào)用者客戶端。這是一個漫長的過程,并且您的語音和視頻有很大的機會出現(xiàn)延遲。

想象一下您的用戶在您的軟件APP上遇到口吃和結(jié)巴的情況。不受歡迎吧?

如果我們刪除服務(wù)器并直接連接瀏覽器會怎么樣?

這正是 WebRTC 在實時視頻通話中所做的事情。

WebRTC 是一種無需服務(wù)器即可連接客戶端軟件APP的技術(shù)。

對于WebRTC,服務(wù)器的作用非常有限。這意味著,它支持兩個瀏覽器相互發(fā)現(xiàn)并直接連接。

那么,您可以在沒有 WebRTC 的情況下開發(fā)網(wǎng)絡(luò)視頻軟件APP嗎?是的,但您可能會面臨以下典型問題:

  • 連接中斷

  • 數(shù)據(jù)丟失

  • NAT穿越

  • 回聲消除

  • 動態(tài)抖動緩沖

  • 自動增益控制

  • 降噪和抑制

  • 帶寬適應(yīng)性

總的來說,當您使用 WebRTC 進行視頻通話時,您可以消除這些問題。此外,這項技術(shù)甚至不需要任何插件或第三方軟件。此外,作為開源項目,其所有源代碼均可在https://webrtc.org/免費獲取

此外,所有主流瀏覽器(如 Firefox、Bing 和 Chrome)都支持 WebRTC。

注意:開始之前請檢查 WebRTC視頻通話 API的兼容性。

現(xiàn)在,廢話不多說,讓我們詳細了解一下。

 
想要開發(fā)您自己的 WebRTC 視頻聊天軟件APP?
請求演示

WebRTC 在軟件APP開發(fā)中的好處

如果您計劃在沒有服務(wù)器的情況下將實時通信功能開發(fā)到您的軟件APP中,WebRTC 是一種理想的技術(shù)。您可以輕松地將以下交互功能開發(fā)到您的軟件APP中:

  • 文字通訊:

這使得用戶可以在所有支持 Webrtc 音頻和視頻的 iOS/Android 聊天軟件APP上通過文本進行實時聊天體驗。

  • 語音通訊:

基于 IP 語音技術(shù),通過互聯(lián)網(wǎng)實時聊天軟件APP。低延遲可在所有設(shè)備上建立一對一或一對多的 WebRTC語音聊天軟件APP連接。

  • 視頻通訊:

視頻連接有助于在 Android/iOS 聊天軟件APP上以低延遲持續(xù)進行高質(zhì)量的支持 WebRTC 的視頻和音頻通話。 

WebRTC:詳細探索該技術(shù)

WebRTC 兼容平臺

  • 桌面:

    • Chrome、火狐、Opera

  • 移動的:

    • 安卓和iOS支持

WebRTC 的功能依賴

在開始開發(fā)實時WebRTC 視頻聊天軟件APP之前,讓我們先明確一下用于開發(fā) WebRTC Android/iOS 和網(wǎng)絡(luò)聊天軟件APP的功能依賴關(guān)系。

  • 完善的 WebRTC 庫

每個希望使用WebRTC API為 Android、iOS 或 Web 瀏覽器開發(fā)聊天軟件APP的開發(fā)人員都需要一個完整的WebRTC 點對點本機代碼包。

  • jQuery

jQuery 用于處理事件操作,并通過可在多種瀏覽器上運行的易于使用的 API 來簡化 HTML。

  • 語義 UI CSS:

一個框架,用于通過人性化的 HTML 和優(yōu)雅的 CSS 框架設(shè)計響應(yīng)式布局,致力于美化聊天平臺的用戶體驗。

  • 車把

兼容的模板提供了用 HTML 語言開發(fā)語義模板的潛在能力。這給移動設(shè)備帶來了重大變化,在 Android 和 iOS 平臺上嵌入了簡單的 WebRTC 消息傳遞功能。

WebRTC 中的 API 和對象 

除了依賴項之外,開發(fā)支持 WebRTC 的視頻和語音通話的聊天軟件APP還需要多個框架和功能。

下面提到的是WebRTC中的API和對象:

  • WebRTC 中的 API

    • getUserMedia():這是一個 WebRTC API。您可以在 JavaScript 代碼中調(diào)用該方法來請求訪問用戶的攝像頭和麥克風。

  • WebRTC 中使用的對象

    • MediaRecorder:這是您在 JavaScript 代碼中創(chuàng)建的對象。它用于記錄媒體流,例如音頻和視頻,您可以通過 getUserMedia() API 獲取這些媒體流。

    • RTCPeerConnection:這也是您在 JavaScript 代碼中創(chuàng)建的對象。它負責管理對等連接并處理對等點之間的媒體流協(xié)商。

    • RTCDataChannel:這是您創(chuàng)建的一個對象,用于在對等點之間建立數(shù)據(jù)通道以傳輸任意數(shù)據(jù)。

探索 WebRTC 基礎(chǔ)設(shè)施

最初,視頻和語音通話功能都依賴于相互連接的兩個客戶端服務(wù)器之間的流媒體。 

互聯(lián)網(wǎng)語音協(xié)議 (VoIP) 是網(wǎng)絡(luò)語音和實時視頻聊天軟件APP最熟悉和最值得信賴的標準技術(shù)之一。

聊天應(yīng)用的視頻/音頻傳輸

正如我們非常清楚的那樣,WebRTC 是將流媒體內(nèi)容從一個客戶端服務(wù)器傳輸?shù)搅硪粋€客戶端服務(wù)器的重要實現(xiàn)。

  • 信令

  • STUN服務(wù)器

  • TURN服務(wù)器

我們來看看細節(jié):

發(fā)出“連接模式”信號

信令是最重要的概念之一,其中在通信之前,兩個對等方必須知道彼此的信息才能進行連接。這些信息包括,

  • 有關(guān)任何其他通信對等點是否存在的更新

  • 網(wǎng)絡(luò)數(shù)據(jù),例如對等方的 IP 地址和端口

  • 會話控制消息 – 用于打開和結(jié)束通信

  • 錯誤信息

  • 媒體元數(shù)據(jù),包括編解碼器、編解碼器設(shè)置、頻段。

  • 寬度和媒體類型

  • 安全連接所需的關(guān)鍵數(shù)據(jù)

此信息稱為元數(shù)據(jù),是發(fā)生任何直接連接所必需的。對于發(fā)出信號來說,服務(wù)器的可用性是必須的。

信令啟動兩個瀏覽器之間的初始通信。在此過程中,對等體交換有關(guān)其他對等體的信息。一旦共享這些數(shù)據(jù),它就會在對等點之間創(chuàng)建直接連接。該信令機制一直使用到建立直接連接為止。

會話描述協(xié)議

這是一種描述用于公告和邀請的多媒體通信會話的格式。它支持包括VoIP和視頻會議在內(nèi)的流媒體應(yīng)用。這里,WebRTC沒有規(guī)定信令方法和協(xié)議。我們必須自己建造它。

眾所周知,WebRTC 需要兩個對等方作為提供者和應(yīng)答者來進行數(shù)據(jù)交換;通信需要這些會話描述協(xié)議 (SDP) 格式。

會話描述協(xié)議格式如下所示:

  • v=0

  • o=- 7614219274584779017 2 輸入 IP4 127.0.0.1

  • s=-

  • t=0 0

  • a=組:捆綁音頻視頻

  • a=msid-語義:WMS

  • m=音頻 1 RTP/SAVPF 111 103 104 0 8 107 106 105 13 126

  • c=IP4 0.0.0.0

WebRTC 根據(jù)您設(shè)備上的音頻/視頻自動創(chuàng)建上述代碼。

現(xiàn)在,讓我們繼續(xù)了解它們?nèi)绾螀f(xié)同工作。

WebRTC 如何在您的軟件APP中工作?

在開始該過程之前,最好了解一些有關(guān) IP 地址和端口的知識。

IP 地址是連接到互聯(lián)網(wǎng)的每個設(shè)備的標識號。而端口號指定了互聯(lián)網(wǎng)或其他網(wǎng)絡(luò)消息從一端轉(zhuǎn)發(fā)到另一端的過程。

此外,主要使用端口號,以便將數(shù)據(jù)定向到設(shè)備內(nèi)的當前位置。然而,一般來說,連接到互聯(lián)網(wǎng)的每個設(shè)備都有一個 IP 地址和端口,通常為 65,536。

從工作流程和 API 開始:

這些RTCPeerConnection API 和信令都是關(guān)于提供、應(yīng)答和候選。我們來詳細看看

您可以使用RTCPeerConnection API 在用戶之間傳輸音頻和視頻。該信令與RTCPeerConnection一起工作。它在瀏覽器之間建立直接連接。

接下來我們看一下RTCPeerConnection的整個流程是如何進行的。首先,這個過程涉及兩個步驟,

元數(shù)據(jù)的使用——獲取本地視音頻媒體條件即通過信令發(fā)送數(shù)據(jù)

另一種是獲取潛在的網(wǎng)絡(luò)地址來托管軟件APP。

當您獲得分辨率和編解碼器功能等元數(shù)據(jù)時,信令機制會在遠程服務(wù)器之間交換它們。

讓我們通過一個例子來理解這個場景。例如,假設(shè)有兩個用戶“X”和“Y”。

如果假設(shè) X 呼叫 Y – 那么在媒體條件下有可能發(fā)生以下步驟:

一旦確定了本地語音和視頻數(shù)據(jù)(例如分辨率和編解碼器功能),就應(yīng)該使用遠程瀏覽器與信令機制進行交換。

讓我們通過一個例子來理解這個場景。例如,假設(shè)有兩個用戶“X”和“Y”。如果假設(shè) X 呼叫 Y – 那么當他們共享信息時,在媒體條件下有可能發(fā)生以下步驟,

  • X 將創(chuàng)建RTCPeerConnection對象

  • X 將使用RTCPeerConnection createoffer()方法創(chuàng)建報價

  • 現(xiàn)在,X調(diào)用setLocalDescription()將創(chuàng)建的offer設(shè)置為本地媒體的描述 

  • 然后X使用信令機制提出報價并將其發(fā)送給Y

  • Y 調(diào)用setRemoteDescription()并提供 X 的報價,以便他的RTCPeerConnection可以了解所有 X 的設(shè)置

現(xiàn)在,Y根據(jù) X 的數(shù)據(jù)調(diào)用createAnswer() 。因此,成功回調(diào)函數(shù)是用 Y 的答案生成的

  • Y 通過調(diào)用setLocalDescription()將 X 的答案設(shè)置為本地描述

  • 然后Y使用信號機制通過信號向她發(fā)送答案

  • X 使用setRemoteDescription將 Y 的答案設(shè)置為遠程會話描述

現(xiàn)在,X 和 Y 也將交換網(wǎng)絡(luò)信息。這里,“尋找候選者”使用ICE框架來識別網(wǎng)絡(luò)接口和端口。

完成上述所有過程后,X 將創(chuàng)建一個帶有onIcecandidate處理程序的RTCPeerConnection對象

僅當候選網(wǎng)絡(luò)可用時才會調(diào)用此處理程序

在處理程序中,X通過其信號機制向 Y發(fā)送信號候選數(shù)據(jù)

當 Y 從 X 收到候選消息時,Y 將調(diào)用addIceCandidate()將候選者添加到遠程對等點描述中

WebRTC 支持ICE 候選滴注。這意味著,呼叫者一旦提出初始報價,就會向候選人提供被呼叫者。因此,被叫方可以自動開始呼叫并建立連接,而無需等待其他候選人到達。

總的來說,需要注意的一點是,一旦創(chuàng)建報價,WebRTC 就會自動創(chuàng)建 ICE 候選人。因此,我們應(yīng)該實現(xiàn)通過信令接收和發(fā)送這些候選者所需的方法。

一旦有關(guān)媒體條件和 ICE 候選者的信息在兩個對等點之間共享,WebRTC 就會自動在兩個對等點之間創(chuàng)建直接連接,以進行任何視頻聊天或其他對話。

完成信令 — 引入 ICE 來應(yīng)對 NAT 和防火墻

使用唯一的 IP 地址和端口號獲取用于視頻聊天的WebRTC連接,并在對等方之間交換它們以直接通信,可能聽起來很簡單,但要困難得多。這是由于兩個因素可能導致這里出現(xiàn)問題。因此,在使用任何網(wǎng)絡(luò)視頻會議軟件APP之前處理這些問題至關(guān)重要。

讓我們檢查這兩個導致問題/因素,

1)網(wǎng)絡(luò)地址轉(zhuǎn)換

網(wǎng)絡(luò)地址轉(zhuǎn)換 (NAT) 是將一個或多個本地 IP 地址轉(zhuǎn)換為一個或多個全局 IP 地址的過程,目的是為本地主機提供 Internet 訪問。

好吧,我們都知道它是標識互聯(lián)網(wǎng)上設(shè)備連接的地址。因此,每個人都認為所有設(shè)備都會有一個唯一的 IP 地址,但事實并非如此。

一般來說,IPv4 地址的長度為 32 位,這表明總共大約有 40 億個唯一地址 (232 = 4,294,967,296) 可用。但研究發(fā)現(xiàn),僅 2018 年就有約 220 億臺設(shè)備連接到互聯(lián)網(wǎng)。

現(xiàn)在,您可能會想這怎么可能? – 當只有 40 億個可能的唯一地址可用時,為什么 220 億臺設(shè)備可以連接到互聯(lián)網(wǎng)?正確的!

對此,答案是“NAT”。

在這里,當這些 IP 地址分為兩類時,整個故事發(fā)生了轉(zhuǎn)變:公共 IP 地址和私有 IP 地址。

現(xiàn)在,公共IP地址只能分配給一臺設(shè)備,而私有IP地址則不然。 NAT 的理念是為多個設(shè)備提供通過單個公共地址訪問互聯(lián)網(wǎng)的能力。

因此,這表明每個設(shè)備將僅擁有有關(guān)其私有 IP 地址的信息,而不是有關(guān)路由器的公共 IP 地址的信息。此外,在 Google 搜索期間,Google 也會跟蹤并僅告訴您路由器的公共 IP 地址。

因此,我們可以說每個設(shè)備都有兩個 IP 地址,既是私有 IP 地址,也是公共 IP 地址。在這種情況下,網(wǎng)絡(luò)候選僅包含有關(guān)設(shè)備的私有 IP 地址的詳細信息。它根本不知道公共 IP 地址。所以,現(xiàn)在我們需要找到一種方法讓瀏覽器知道公共IP地址,以便候選人創(chuàng)建公共IP地址。

此后,使用 STUN(NAT 會話遍歷實用程序)服務(wù)器。在這里,當設(shè)備向 STUN 服務(wù)器發(fā)出請求時,STUN 將回復一條消息。它包含路由器的公共IP并幫助瀏覽器生成候選者。

2)防火墻

防火墻是一種網(wǎng)絡(luò)安全設(shè)備,用于監(jiān)視傳入和傳出的網(wǎng)絡(luò)流量。它還決定是否需要允許或阻止特定流量,所有這些都取決于定義的安全協(xié)議集。

點對點 webrtc 視頻聊天應(yīng)用

現(xiàn)在,讓我們看看這個防火墻如何在 WebRTC 方面造成問題。

好吧,為了解決這里的防火墻問題,我們需要利用 TURN(使用中繼 NAT 遍歷)服務(wù)器。當直接對等連接失敗時,TURN 服務(wù)器直接在兩個瀏覽器或?qū)Φ赛c之間中繼流量。

webrtc視頻聊天應(yīng)用

現(xiàn)在我們知道,這些 STUN 和 TURN 服務(wù)器用于使用 WebRTC 進行點對點連接。我們可以將 TURN/STUN 與WebRTC 視頻聊天軟件APP集成,只需將包含 TURN 和 STUN 服務(wù)器 URL 的對象傳遞給RTCPeerConnection作為其參數(shù)即可。





讓我們用編碼來進行說明,以便更好地理解整個概念。

WebRTC 編碼示例

WebRTC 編碼示例
//包含 TURN/STUN URL 的對象。 var pcConfig = { 'iceServers': [ { 'urls': 'stun:stun.l.bing 或 google.com:19302' }, { 'urls': '轉(zhuǎn):192.158.29.39:3478?transport=udp', '憑證': 'l;;OjdsfjGRntt2u2uiw=', '用戶名': '786543:6789098744' }, { 'urls': '轉(zhuǎn):192.158.29.39:3478?transport=tcp', '憑證': 'l;; OjdsfjGRntt2u2uiw=', 'username': '786543:6789098744' } ] }…….. //將上述對象傳遞給 RTCPeerConnection RTCPeerConnection(pcConfig);

在上面的示例中,我們必須單獨傳遞 URL,其余的事情將由 WebRTC 管理。

查看插圖,其中包含使用 Javascript 和 WebRTC 技術(shù)進行實時視頻通話期間建立的所有連接。

webrtc點對點視頻通話

但在整個過程中,也有一些需要注意的地方。這包括,

使用 STUN 服務(wù)器成功連接而不需要 TURN 是很常見的。但有時,TURN服務(wù)器也用于撥打電話

XirSys 等一些組織免費提供 TURN 和 STUN 服務(wù)器

這是開發(fā) JavaScript 視頻聊天軟件APP的步驟的開始。但在實施方面還有很多值得探索的地方。我們將在未來的博客中對其進行研究,因此請保持警惕并了解更多信息。


The End