答案SDP中缺少什么(从网络浏览器到Android设备)

时间:2017-05-10 06:29:45

标签: webrtc sdp apprtc peer-connection

我已经定制了Apprtc项目。我可以从用户拨打电话,其他用户可以接听电话或拒绝电话

当我从android到web浏览器调用时,我无法在android设备中看到web浏览器的视频源但我只能在web浏览器中看到android的视频源。

网络浏览器版本:Chrome 58(桌面版) Android版:Marshmallow

提供SDP :(来自Android)

V = 0 o = - 7916385280226465055 2 IN IP4 127.0.0.1

S = -

t = 0 0

a = group:BUNDLE音频视频

a = msid-semantic:WMS ARDAMS ___

m = audio 9 UDP / TLS / RTP / SAVPF 111 103 9 102 0 8 105 13 126

c = IN IP4 0.0.0.0

a = rtcp:9 IN IP4 0.0.0.0

α=冰冷ufrag:xKDP

α=冰冷PWD:/ hAtH4MAzGA / If6Fn + sT6Okj

α=冰冷选项:再提名

α=指纹:SHA-256 35:5A:08:8D:FA:18:41:B9:A6:E2:B4:9A:A7:EE:1E:61:CA:38:BC:5B:98:9F:D1:3E:1F: 51:79:C8:F3:63:00:F8

α=设置:actpass

α=中期:音频

a = extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

a = extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time

α= SENDRECV

α= 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:9 G722 / 8000

a = rtpmap:102 ILBC / 8000

a = rtpmap:0 PCMU / 8000

a = rtpmap:8 PCMA / 8000

a = rtpmap:105 CN / 16000

a = rtpmap:13 CN / 8000

a = rtpmap:126 telephone-event / 8000

a = ssrc:1281015102 cname:wYjcft96aVDGkQzC

a = ssrc:1281015102 msid:ARDAMS ___ ARDAMSa0

a = ssrc:1281015102 mslabel:ARDAMS ___

a = ssrc:1281015102标签:ARDAMSa0

m =视频9 UDP / TLS / RTP / SAVPF 100 101 116 117 96 97 98

c = IN IP4 0.0.0.0

a = rtcp:9 IN IP4 0.0.0.0

α=冰冷ufrag:xKDP

α=冰冷PWD:/ hAtH4MAzGA / If6Fn + sT6Okj

α=冰冷选项:再提名

a =指纹:sha-256 35:5A:08:8D:FA:18:41:B9:A6:E2:B4:9A:A7:EE:1E:61:CA:38:BC:5B: 98:9F:D1:3E:1F:51:79:C8:F3:63:00:F8

α=设置:actpass

α=中期:视频

a = extmap:2 urn:ietf:params:rtp-hdrext:toffset

a = extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time

a = extmap:4 urn:3gpp:video-orientation

a = extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01

a = extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay

α= SENDRECV

α= RTCP-MUX

α= RTCP-RSIZE

a = rtpmap:100 VP8 / 90000

a = rtcp-fb:100 ccm fir

a = rtcp-fb:100 nack

a = rtcp-fb:100 nack pli

a = rtcp-fb:100 goog-remb

a = rtcp-fb:100 transport-cc

a = rtpmap:101 VP9 / 90000

a = rtcp-fb:101 ccm fir

a = rtcp-fb:101 nack

a = rtcp-fb:101 nack pli

a = rtcp-fb:101 goog-remb

a = rtcp-fb:101 transport-cc

a = rtpmap:116 red / 90000

a = rtpmap:117 ulpfec / 90000

a = rtpmap:96 rtx / 90000

a = fmtp:96 apt = 100

a = rtpmap:97 rtx / 90000

a = fmtp:97 apt = 101

a = rtpmap:98 rtx / 90000

a = fmtp:98 apt = 116

a = ssrc-group:FID 2034101263 3486873766

a = ssrc:2034101263 cname:wYjcft96aVDGkQzC

a = ssrc:2034101263 msid:ARDAMS ___ ARDAMSv0

a = ssrc:2034101263 mslabel:ARDAMS ___

a = ssrc:2034101263标签:ARDAMSv0

a = ssrc:3486873766 cname:wYjcft96aVDGkQzC

a = ssrc:3486873766 msid:ARDAMS ___ ARDAMSv0

a = ssrc:3486873766 mslabel:ARDAMS ___

a = ssrc:3486873766标签:ARDAMSv0

回答SDP :(来自网络浏览器)

V = 0

o = mozilla ... THIS_IS_SDPARTA-52.0.2 6548308332703463210 0 IN IP4 0.0.0.0

S = -

t = 0 0

a =指纹:sha-256 E6:0F:6A:A6:35:E0:B3:8E:7A:0E:2E:20:A9:AB:0B:CA:1C:6D:33:6C: B6:D1:E4:2D:39:87:1E:93:4E:ED:BB:CF

a = group:BUNDLE音频视频

α=冰冷选项:滴流

a = msid-semantic:WMS *

m =音频9 UDP / TLS / RTP / SAVPF 111 126

c = IN IP4 0.0.0.0

α= recvonly

a = extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

a = fmtp:111 maxplaybackrate = 48000; stereo = 1; useinbandfec = 1

a = fmtp:126 0-15

α=冰冷PWD:8a4fad1c837809d3ee952922dbe2b927

α=冰冷ufrag:ab799d79

α=中期:音频

α= RTCP-MUX

a = rtpmap:111 opus / 48000/2

a = rtpmap:126 telephone-event / 8000/1

α=设置:活性

a = ssrc:2269112214 cname:{b1e7d024-d327-4788-a5b1-a1b8291b5c8d}

m =视频9 UDP / TLS / RTP / SAVPF 100

c = IN IP4 0.0.0.0

α= recvonly

a = fmtp:100 max-fs = 12288; max-fr = 60

α=冰冷PWD:8a4fad1c837809d3ee952922dbe2b927

α=冰冷ufrag:ab799d79

α=中期:视频

a = rtcp-fb:100 nack

a = rtcp-fb:100 nack pli

a = rtcp-fb:100 ccm fir

a = rtcp-fb:100 goog-remb

α= RTCP-MUX

a = rtpmap:100 VP8 / 90000

α=设置:活性

a = ssrc:1613714278 cname:{b1e7d024-d327-4788-a5b1-a1b8291b5c8d}

在peerconnection.cc中current_tracks变量未填充:

void PeerConnection::UpdateRemoteStreamsList(
    const cricket::StreamParamsVec& streams,
    bool default_track_needed,
    cricket::MediaType media_type,
    StreamCollection* new_streams) {

  TrackInfos* current_tracks = GetRemoteTracks(media_type);

  // Find removed tracks. I.e., tracks where the track id or ssrc don't match
  // the new StreamParam.
  auto track_it = current_tracks->begin();
  while (track_it != current_tracks->end()) {

3 个答案:

答案 0 :(得分:1)

通过查看你的答案SDP,它没有携带任何流/轨道 疑似问题可能是,您在浏览器中创建答案之前未添加流 您可以通过打开 chrome:// webrtc-internals /

来检查PeerConnection API调用

PeerConnection API调用应该在浏览器/已解答端

中如下
pc = new RTCPeerConnection({"iceServers": [{"urls": "stun:stun.l.google.com:19302"}]}, 
                           {"optional": [{"DtlsSrtpKeyAgreement": true}]
        }); 

pc.setRemoteDescription(
        new RTCSessionDescription(jsep),
        function() {
            console.log(' OFFER accepted ');
        }, function(e) {
            console.log(' OFFER Failed ', e);
    });

pc.addStream(stream);

pc.createAnswer(function(answer) {
            console.log('got answer', answer);
            pc.setLocalDescription(answer, 
                    function() {
                        console.log('set local description sucesses ');
                    }, function(e) {
                        console.log('set local description failed ', e);
                    });
          // Send the answer to other user endpoint
        }, function() {
            console.log('Error: Unable to create answer');
        }, {
            'mandatory': {
                'OfferToReceiveAudio': true, 
                'OfferToReceiveVideo': true, 
            }
        });
}

因此,您的答案SDP应包含a=sendonly行,而不是a=recvonly

答案 1 :(得分:1)

您的浏览器SDP具有a=recvonly属性,这意味着本地流不会添加到您的Peerconnection中。如果您的浏览器正在向远程发送音频/视频轨道并希望接收远程流,那么它应该在AnswerSDP中有a=sendrec

答案 2 :(得分:0)

扩展其他答案:只有在确保已获取本地流并将其添加到RTCPeerConnection后,才应发送连接信号。

navigator.mediaDevices.getUserMedia({
    audio: false, // request access to local microphone
    video: true  // request access to local camera
}).then(function (local_stream) {
    // display preview from the local camera & microphone using local <video> MediaElement
    var media_element = document.getElementById('local_video');
    media_element.srcObject = local_stream;
    media_element.play();
    // add local camera stream to peer_connection ready to be sent to the remote peer
    peer_connection.addStream(local_stream);
    signal_init();
}).catch(console.log);

signal_init是您的信令/连接回调。