本文不適合JS調用方法,但是可以參考,原理大同小異。
適用於JAVA,OC,C++。其實也就是相關平臺WINDOWS,IOS,android,linux。
官方的接口和使用流程如下:
https://webrtc.org/native-code/native-apis/
可能有些難以看懂。那麼可以先看我的使用方法,再回去看官方文檔。
先介紹webrtc,其實他是一個客戶端用的東西。主要包含音視頻相關以及P2P服務這兩大塊功能。
音視頻提供了編解碼,回聲消除,聲音增益,去噪。
P2P則封裝了SDP協議消息,與turn服務器通信。
也就是說,它是一個無關使用邏輯,僅提供模塊功能的強大庫。
RTCPeerConnection就是webrtc用來創建客戶端連接和視頻通訊的API.爲了初始化這個過程 RTCPeerConnection有兩個任務:
1,確定本地媒體條件,如分辨率,編解碼能力,這些需要在offer和answer中用到.
2,取到應用程序所在機器的網絡地址,即稱作candidates.
一旦上面這些東西確定了,他們將通過信令機制和遠端進行交換.
舉個例子說它的使用邏輯以及僞碼:
A呼叫B,這裏有2條線,一條是互相交換媒體信息,網絡地址,另一條是與TURN服務器的打洞:
線路1:
1,A通過PeerConnectionFactory創建一個 RTCPeerConnection對象.
安卓用戶記得調用initializeAndroidGlobals初始化環境,否則會奔潰。
ICE服務初始化
PeerConnection.IceServer ice = new PeerConnection.IceServer(IceAddr, user, password);
ices.add(ice);
創建本地媒體
MediaConstraints audioMC = new MediaConstraints();
AudioSource as = pcf.createAudioSource(audioMC);
AudioTrack at = pcf.createAudioTrack("localaudiotrack", as);
localMS = pcf.createLocalMediaStream("localmediastream");
localMS.addTrack(at);
2,A創建一個offer(即SDP會話描述)通過RTCPeerConnection createOffer()方法.
3,A調用setLocalDescription()方法用他的offer.
4,A通過信令機制(這些用戶自己實現)將他的offer發給Eve.
5,B調用setRemoteDescription()方式設置A的offer,因此他的RTCPeerConnection知道了A的設置.
setRemoteDescription(this, _remoteSDP);
6,B調用方法createAnswer(),然後會觸發一個callback,這個callback裏面可以得到自己的answer.
7,B設置他自己的ansew通過調用方法setLocalDescription().
8,B通過信令機制將他的answer發給A.
9,A設置B的answer通過方法setRemoteDescription().
線路2:
另外A和B也需要交換網絡信息(即candidates)
這個candidates是描述和TURN的交互信息。可能有洞的變化,等等。明白UDP打洞的會直接明白,可以看看我的另一篇博客(http://blog.csdn.net/mqdchalali/article/details/52893160)。
1,A創建RTCPeerConnection對象時設置了onicecandidate handler.
2,hander被調用當candidates找到了的時候(就是說A和TURN服務器有了交互,找到了傳輸數據的通道,可能是中轉,可能是P2P通道,這些是透明的用戶無法看到).
3,當B收到來自A的candidate消息的時候,他調用方法addIceCandidate(),添加candidate到遠端描述裏面.
也就是說,我們只需要實現自己的信令服務器,配合上面的流程就可以使用。
具體的代碼細節,建議去看官方的安卓demo,或者C++版本的demo。
下載源碼後,路徑如下:
webrtc-master-webrtc\examples\androidapp\
webrtc-master-webrtc\examples\peerconnection\client\