本篇博文將會提供一個關于如何使用WebRTC建立一個視頻會議App的教程。
我們不會將其設計的太復雜,它將會是一個簡單的一對一視頻會議App,并且僅僅使用了WebRTC APIs和一些其他的library來建立一個信令服務器。
在開始之前,讓我們首先進行一個快速摘要簡述。
為此我們應該觀察如下WebRTC通信過程的圖。
WebRTC的通信過程可以看成如下三步:
1.瀏覽器獲取媒體設備(攝像頭和麥克風)。
2.通過信令過程,每一個peer和其它所有peer交換信息。
3.發信之后,peers可以直接連接,并開始通信交流。
為了實現這個過程,對于交換信息需要一個信令服務器。同樣需要一對STUN/TURN服務器來實現NAT穿透。并且在不能直接通信的情況下傳遞媒體。
讓我們轉到App設計的部分。
App
就如之前所說,我們將會建立一個簡單的一對一視頻會議App.它將會有一個房間功能,在每個房間將會主持不同的會議。
用戶首先看到一個需要輸入房間號的屏幕界面,可以是用戶想去的任意一個房間,接著當另一個用戶想要加入的時候,他可以輸入同樣的房間號來開始交流通話。
此教程的代碼在Github的一個公共目錄下可以查到,你可以克隆到你的電腦上或跟著文章在紙上描繪出來。
我們使用了JAVAScript作為編程語言,Node.JS作為運行引擎,所以如果你沒有的話可以安裝它。
讓我們從創建一個文件夾開始,這將會是我們的項目文件夾。接著在里面創建另一個名字叫做public的文件夾。現在使用命令行,轉到項目文件夾并將如下命令粘貼到命令行里來安裝所需。為了下載library需要確保網絡連接正常。
npm init -y
npm install -S express@4.15.4 socket.io@2.0.3
現在讓我們創建一個簡單的html文件。它將會包含兩個div元素,一個為了輸入房間號,另一個為了顯示視頻流。這個文件也會包含socket.io客戶端library腳本標簽,另一個文件我們之后會創建。
使用你最喜愛的文本編輯器,創建一個新文件,粘貼如下代碼并且保存在項目文件夾中,在public文件夾里保存為index.html文件。
很棒。下一步是創建一個客戶端的JavaScript文件。在這個文件中將會得到網頁元素就像div元素的引用,用戶用來輸入房間號的輸入文本,用戶點擊的按鈕,等等。接著我們聲明一些全局變量來存儲像房間號,本地和遠程視頻音頻流,和點點連接對象和使用的TURN/STUN服務器。
我們還會連接到socket.io服務器并添加一個點擊按鈕的事件,在這個事件中,我們向服務器發送一條創建或加入的信息。粘貼如下代碼到新文件中并且在public文件夾下保存為client.js文件。
在向服務器發送了初始信息之后,我們需要等待響應,我們可以在同一個client.js文件中建立一些event handlers.
當第一個參與者加入了會話,服務器創建一個新房間接著發送給用戶‘’加入‘’事件。接著對第二個參與者同樣如此:瀏覽器獲取媒體設備,存儲視頻音頻流,在屏幕上展示視頻,但是發生了另一個動作,一條‘’準備好了‘’的信息發送到了服務器端。添加如下代碼到client.js文件底部。
到目前為止第一步完成。
當第一個參與者接收到準備好了的信息時,它的反饋創建了一個RTCPeerConnection對象,設置對象的onicecandidate和onaddstream listeners為相應的onIceCandidate和onAddStream函數,我們之后將會重溫這些函數。最終它將本地流添加到了peer connection對象中。之后它準備一個請求,請求存儲在本地并通過setLocalAndOffer函數發送到服務器端。
服務器傳遞請求到第二個參與者,第二個參與者反過來在請求反饋方面做了同樣的事:創建了它自己的peer connection對象并且設置事件聽眾,接著存儲請求準備一個將會存儲在本地的應答,接著通過setLocalAndAnswer函數發送到服務器端。
和請求相似,服務器會將回答傳遞給第一個參與者。當發生這些時,兩個peers就在通過向服務器發送candidate信息交換icecandidates,服務器反過來傳遞它們給其它客戶端。Ice candidates被添加到每一個客戶端的peer connection 對象中。將如下代碼添加到client.js文件中。
第二步就此完成。
當一切準備就緒后,每一個peer接收遠程流,接著onAddStream函數將會將它顯示在屏幕上。以下是client.js文件中的函數。
現在我們完成了第三步。
然而我們的服務器還沒有完成。我們從詢問所需的library開始,并且在public文件夾中設置static host來服務客戶端文件。
接著我們使用socket.io定義信號處理 程序。首先我們會得到創建或加入事件,它們會統計房間中客戶端的數量。如果沒有用戶說明客戶端是第一個peer,因此向它發送一個創建事件。如果房間中已經存在了一個參與者,那么客戶端會被添加到房間中,并且向它發送加入事件。如果房間中已經有兩個用戶,那么這被認為是房間滿了的情況,因此不需要再添加客戶端。
這一連串的事件都是按照傳遞順序工作的,向房間中其它客戶端發送接收到的同樣的信息。創建一個新文件,粘貼如下代碼并保存它到項目文件夾下,名為server.js.
既然我們已經具備了所有所需的文件,我們已經準備好測試我們的應用了。在命令行,進入項目文件夾中并且輸入如下命令:
node server.js
接著使用 google Chrome or Mozilla Firefox,將此鏈接在兩個標簽下打開,確保你都輸入了同樣的房間號。
是不是很酷?
我們已經創建了我們的第一個視頻會議App.