前言
公司某個專案需要接入音視頻即時通訊, 功能類似微信的撥打視頻通話,語音通話的場景,那么對于音視頻通訊會用到什么技術呢?沒錯,它就是 WebRTC ,
什么是WebRTC
WebRTC,名稱源自網頁實時通信(Web Real-Time Communication)的縮寫,簡而言之它是一個支持網頁瀏覽器進行實時語音對話或視頻對話的技術,
它為我們提供了視頻會議的核心技術,包括音視頻的采集、編解碼、網路傳輸、顯示等功能,并且還支持跨平臺:windows,linux,mac,android,iOS,
它在2011年5月開放了工程的源代碼,在行業內得到了廣泛的支持和應用,成為下一代視頻通話的標準,
iOS端 WebRTC的使用
1. 了解構建一個音視頻通訊的結構
一個完整的音視頻通訊結構包括兩部分: Server 服務器端, Client客戶端
- Server端:
Stun服務器 : 服務器用于獲取設備的外部網路地址
Turn服務器 : 服務器是在點對點失敗后用于通信中繼
信令服務器 : 負責端到端的連接,兩端在連接之初,需要交換信令,如sdp、candidate等,都是通過信令服務器 進行轉發交換的, - Client有四大應用端:
Android、 iOS、 PC、 Broswer
2. 了解WebRTC建立連接的程序

2.1這里介紹一下WebRTC三個核心組件
MediaStream:通過MediaStream的API能夠通過設備的攝像頭及話筒獲得視頻、音頻的同步流RTCPeerConnection:RTCPeerConnection是WebRTC用于構建點對點之間穩定、高效的流傳輸的組件RTCDataChannel:RTCDataChannel使得瀏覽器之間(點對點)建立一個高吞吐量、低延時的信道,用于傳輸任意資料,
其中RTCPeerConnection是核心中的核心
2.2 WebRTC 連接的流程說明
-
1.客戶端通過
socketorwebSocket和服務器建立起TCP長鏈接, 這部分WebRTC并沒有提供相應的API, 所以這里可以借助第三方框架,諸如: OC版本的SocketRocket, Swift版本的Starscream

-
2.客戶端通過信令服務器, 進行
offerSDP握手
SDP(Session Description Protocol):描述建立音視頻連接的一些屬性,如音頻的編碼格式、視頻的編碼格式、是否接收/發送音視頻等等
SDP 是通過webrtc框架里面的PeerConnection所創建, 詳細創建請參考我的demo.
- 3.客戶端通過信令服務器, 進行
Candidate握手
Candidate:主要包含了相關方的IP資訊,包括自身局域網的ip、公網ip、turn服務器ip、stun服務器ip等
Candidate 是通過webrtc框架里面的PeerConnection所創建, 詳細創建請參考我的demo.
- 4.客戶端在
SDP和Candidate握手成功后, 就建立起一個P2P端對端的鏈接, 視頻流就能直接傳輸, 不需要經過服務器啦.
3.了解SDP握手流程和Candidate握手流程
SDP握手流程和Candidate握手流程類似, 但有點繁瑣, 下面就SDP握手流程簡要說明:
下圖為WebRTC通過信令建立一個SDP握手的程序,只有通過SDP握手,雙方才知道對方的資訊,這是建立p2p通道的基礎,
P2P SDP握手流程圖:

發送offer程序:
1.A端通過
RTCPeerConnection的createOffer生成 SDP 描述
2.A端再通過呼叫RTCPeerConnection的setLocalDescription,設定本地的描述資訊
3.A端通過信令將offer SDP發送給B端
4.B端通過信令接收到A端發送過來的offer SDP, 并呼叫RTCPeerConnection的setRemoteDescription,設定遠端的描述資訊
發送answer 程序:
5.B端通過
RTCPeerConnection的createAnswer創建出自己的 SDP 描述
6.B端再通過RTCPeerConnection的setLocalDescription,設定本地的描述資訊
7.B端通過信令將anwser SDP發送給A端
8.A端通過信令接收到B端發送過來的answer SDP, 并呼叫RTCPeerConnection的setRemoteDescription,設定遠端的描述資訊,
9.通過SDP握手后,兩端之間就會建立起一個端對端的直接通訊通道,
由于我們所處的網路環境錯綜復雜,用戶可能處在私有內網內,使用p2p傳輸時,將會遇到NAT以及防火墻等阻礙,這個時候我們就需要在SDP握手時,通過STUN/TURN/ICE相關NAT穿透技術來保障p2p鏈接的建立,
集成時遇到的問題
詳見:
iOS WebRTC集成時遇到的問題總結 (聲音默認輸出由聽筒改為揚聲器、視頻鏡像、遠端視頻全屏等比填充等)
本文來自博客園,作者:reyzhang,轉載請注明原文鏈接:https://www.cnblogs.com/reyzhang/p/16198182.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472415.html
標籤:iOS
