WebRTC建立通信過程
- 基礎設施:必要的信令服務和 NAT 穿越服務
- clientA 和 clientB 分別創建 RTCPeerConnection 並為輸出端添加本地媒體流。如果是視頻通話類型,則意味着,兩端都需要添加媒體流進行輸出。
- 本地 ICE 候選信息采集完成后,通過信令服務進行交換。
- 呼叫端(好比 A 給 B 打視頻電話,A 為呼叫端)發起 offer 信息,接收端接收並返回一個 answer 信息,呼叫端保存,完成連接。
實現1v1視頻聊天
信令服務器
對於上面的額所講到的信令服務器,我們可以采取搭建websocket服務器實現。更進一步,我們可以采用socketio來實現,因為它自帶room管理,可以給我們帶來很多便利。
NAT穿透
而NAT穿透,我們知道在WenRTC中是通過STUN/TURN協議實現的,我們可以自己搭建這種服務器,但比較繁瑣,可以參考https://webrtc.org.cn/stunturn_quick_guide/。作為測試,我們可以使用一些免費的服務器,可以從中選取。
例如:
{url:'stun:stun01.sipphone.com'},
{url:'stun:stun.ekiga.net'},
{url:'stun:stun.fwdnet.net'},
{url:'stun:stun.ideasip.com'},
{url:'stun:stun.iptel.org'},
{url:'stun:stun.rixtelecom.se'},
{url:'stun:stun.schlund.de'},
{url:'stun:stun.l.google.com:19302'},
{url:'stun:stun1.l.google.com:19302'},
{url:'stun:stun2.l.google.com:19302'},
{url:'stun:stun3.l.google.com:19302'},
{url:'stun:stun4.l.google.com:19302'},
{url:'stun:stunserver.org'},
{url:'stun:stun.softjoys.com'},
{url:'stun:stun.voiparound.com'},
{url:'stun:stun.voipbuster.com'},
{url:'stun:stun.voipstunt.com'},
{url:'stun:stun.voxgratia.org'},
{url:'stun:stun.xten.com'},
{
url: 'turn:numb.viagenie.ca',
credential: 'muazkh',
username: 'webrtc@live.com'
},
{
url: 'turn:192.158.29.39:3478?transport=udp',
credential: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
username: '28224511:1379330808'
},
{
url: 'turn:192.158.29.39:3478?transport=tcp',
credential: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
username: '28224511:1379330808'
}
在創建RTCPeerConnection時可以作為選項設置。
https
WebRTC限制遠程訪問攝像頭等媒體設備時,必須使用https做安全訪問,本地測試可以使用http。但是由於我們現在是做1v1視頻聊天,因此一個https服務器是必須的。
無論采用golang,還是nodejs搭建web服務器,提供https訪問是很簡單的,如golang使用gin框架提供web服務時:
router.RunTLS(config.WebServerHostTLS, "ssl/server.crt", "ssl/server.key")
主要就是ssl證書的問題。如果你有購買域名,一般的雲服務提供商都有生成ssl證書的服務,但是如果沒有域名,我們可以使用openssl來創建測試證書。當然這樣的證書由於並為被認證,所以使用時瀏覽器還是會報安全警告,但是這對於我們測試來說足夠了。
openssl生成證書的過程可以參考:https://www.cnblogs.com/pzblog/p/9088286.html .
實現效果
演示地址: https://134.175.26.82:8082/static/demo/remote_chat.html.