美文网首页
Android WebRTC 02 --- 本地预览(creat

Android WebRTC 02 --- 本地预览(creat

作者: 沪漂意哥哥 | 来源:发表于2022-03-20 21:41 被阅读0次

一. 加入房间,获取connections

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

相关文章

网友评论

      本文标题:Android WebRTC 02 --- 本地预览(creat

      本文链接:https://www.haomeiwen.com/subject/davadrtx.html