一. 加入房间,获取connections
![](https://img.haomeiwen.com/i10057738/4582d04dd22e8d9f.png)
image.png
二. PeerConnectionManager.java
public void onJoinToRoom(ArrayList<String> connections, String myId, boolean isVideoEnable, int mediaType) {
videoEnable = isVideoEnable;
this.mediaType = mediaType;
executor.execute(new Runnable() {
@Override
public void run() {
connectionIdArray.addAll(connections);
PeerConnectionManager.this.myId = myId;
if (factory == null) {
factory = createConnectionFactory();
}
if (localStream == null) {
createLocalStream();
}
createPeerConnections();
addStreams();
createOffers();
}
});
}
// 创建所有连接
private void createPeerConnections() {
for (Object str : connectionIdArray) {
Peer peer = new Peer((String) str);
connectionPeerDic.put((String) str, peer);
}
}
// 为所有连接添加流
private void addStreams() {
Log.v(TAG, "2 PeerConnectionManager 为所有连接添加流");
for (Map.Entry<String, Peer> entry : connectionPeerDic.entrySet()) {
if (localStream == null) {
createLocalStream();
}
entry.getValue().pc.addStream(localStream);
}
}
三. Create Offer
// 为所有连接创建offer
private void createOffers() {
for (Map.Entry<String, Peer> entry : connectionPeerDic.entrySet()) {
role = Role.Caller;
Peer mPeer = entry.getValue();
mPeer.pc.createOffer(mPeer, offerOrAnswerConstraint());
}
}
四. Peer 实现 SdpObserver接口
private class Peer implements SdpObserver, PeerConnection.Observer{
private PeerConnection pc;
private String socketId;
public Peer(String socketId) {
this.pc = createPeerConnection();
this.socketId = socketId;
}
@Override
public void onSignalingChange(PeerConnection.SignalingState signalingState) {
}
@Override
public void onIceConnectionChange(PeerConnection.IceConnectionState iceConnectionState) {
}
@Override
public void onIceConnectionReceivingChange(boolean b) {
}
@Override
public void onIceGatheringChange(PeerConnection.IceGatheringState iceGatheringState) {
}
@Override
public void onIceCandidate(IceCandidate iceCandidate) {
}
@Override
public void onIceCandidatesRemoved(IceCandidate[] iceCandidates) {
}
@Override
public void onAddStream(MediaStream mediaStream) {
}
@Override
public void onRemoveStream(MediaStream mediaStream) {
}
@Override
public void onDataChannel(DataChannel dataChannel) {
}
@Override
public void onRenegotiationNeeded() {
}
@Override
public void onAddTrack(RtpReceiver rtpReceiver, MediaStream[] mediaStreams) {
}
//初始化 RTCPeerConnection 连接管道
private PeerConnection createPeerConnection() {
if (factory == null) {
factory = createConnectionFactory();
}
// 管道连接抽象类实现方法
PeerConnection.RTCConfiguration rtcConfig = new PeerConnection.RTCConfiguration(ICEServers);
return factory.createPeerConnection(rtcConfig, this);
}
//****************************新增 SdpObserver****************************/
@Override
public void onCreateSuccess(SessionDescription sessionDescription) {
Log.v(TAG, " PeerConnectionManager sdp创建成功 " + sessionDescription.description);
pc.setLocalDescription(Peer.this, sessionDescription);
}
@Override
public void onSetSuccess() {
Log.v(TAG, "PeerConnectionManager sdp连接成功 " + pc.signalingState().toString()+" role "+role.toString());
}
@Override
public void onCreateFailure(String s) {
}
@Override
public void onSetFailure(String s) {
}
}
五. 获取和设置sdp
2022-03-21 08:28:29.414 4557-4716/com.luisliuyi.demo.webrtc V/PeerConnectionManager: PeerConnectionManager sdp创建成功 v=0
o=- 1421107898077920719 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio video
a=msid-semantic: WMS ARDAMS
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:7AzQ
a=ice-pwd:Zk1+klOnSiChcqW1BtVIBPj6
a=ice-options:trickle renomination
a=fingerprint:sha-256 4F:7D:0E:EB:41:61:C9:23:0E:E2:AD:69:BB:1B:36:6B:BB:08:95:1B:78:55:E7:49:B3:01:58:12:8D:03:32:41
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:102 ILBC/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:2370766807 cname:r5ajO50Vngi3Wx75
a=ssrc:2370766807 msid:ARDAMS ARDAMSa0
a=ssrc:2370766807 mslabel:ARDAMS
a=ssrc:2370766807 label:ARDAMSa0
m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:7AzQ
a=ice-pwd:Zk1+klOnSiChcqW1BtVIBPj6
a=ice-options:trickle renomination
a=fingerprint:sha-256 4F:7D:0E:EB:41:61:C9:23:0E:E2:AD:69:BB:1B:36:6B:BB:08:95:1B:78:55:E7:49:B3:01:58:12:8D:03:32:41
a=setup:actpass
a=mid:video
a=extmap:14 urn:ietf:params:rtp-hdrext:toffset
a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=extmap:13 urn:3gpp:video-orientation
a=extmap:3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:96 VP8/90000
a=rtcp-fb:96 goog-remb
a=rtcp-fb:96 transport-cc
a=rtcp-fb:96 ccm fir
a=rtcp-fb:96 nack
a=rtcp-fb:96 nack pli
a=rtpmap:97 rtx/90000
a=fmtp:97 apt=96
a=rtpmap:98 VP9/90000
a=rtcp-fb:98 goog-remb
a=rtcp-fb:98 transport-cc
a=rtcp-fb:98 ccm fir
a=rtcp-fb:98 nack
a=rtcp-fb:98 nack pli
a=rtpmap:99 rtx/90000
a=fmtp:99 apt=98
a=rtpmap:100 red/90000
a=rtpmap:101 rtx/90000
a=fmtp:101 apt=100
a=rtpmap:127 ulpfec/90000
a=ssrc-group:FID 1990572356 1891033856
a=ssrc:1990572356 cname:r5ajO50Vngi3Wx75
a=ssrc:1990572356 msid:ARDAMS ARDAMSv0
a=ssrc:1990572356 mslabel:ARDAMS
a=ssrc:1990572356 label:ARDAMSv0
a=ssrc:1891033856 cname:r5ajO50Vngi3Wx75
a=ssrc:1891033856 msid:ARDAMS ARDAMSv0
a=ssrc:1891033856 mslabel:ARDAMS
a=ssrc:1891033856 label:ARDAMSv0
2022-03-21 08:28:29.431 4557-4716/com.luisliuyi.demo.webrtc V/PeerConnectionManager: PeerConnectionManager sdp连接成功 HAVE_LOCAL_OFFER role Caller
六. 代码地址
https://gitee.com/luisliuyi/webrtc-android02
网友评论