Answer SDP 中缺少啥(从 Web 浏览器到 Android 设备)
Posted
技术标签:
【中文标题】Answer SDP 中缺少啥(从 Web 浏览器到 Android 设备)【英文标题】:What's missing in Answer SDP (From web browser to android device)Answer SDP 中缺少什么(从 Web 浏览器到 Android 设备) 【发布时间】:2017-10-08 15:54:00 【问题描述】:我已经自定义了Apprtc 项目。我可以从一个用户打来电话,其他用户可以接听或拒绝来电
当我从 android 调用 web 浏览器时,我无法在 android 设备中看到 web 浏览器的视频源,但我只能在 web 浏览器中看到 android 的视频源。
网络浏览器版本:Chrome 58(桌面版) Android版本:棉花糖
提供 SDP:(来自 Android)
v=0 o=- 7916385280226465055 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE 音频视频
a=msid 语义:WMS ARDAMS___
m=音频 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
a=ice-ufrag:xKDP
a=ice-pwd:/hAtH4MAzGA/If6Fn+sT6Okj
a=ice-options:renomination
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
a=setup:actpass
a=mid:音频
a=extmap:1 urn:ietf:params:rtp-hdrext:s-s-rc-audio-level
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 传输-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 电话事件/8000
a=s-s-rc:1281015102 cname:wYjcft96aVDGkQzC
a=s-s-rc:1281015102 msid:ARDAMS___ ARDAMSa0
a=s-s-rc:1281015102 mslabel:ARDAMS___
a=s-s-rc: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
a=ice-ufrag:xKDP
a=ice-pwd:/hAtH4MAzGA/If6Fn+sT6Okj
a=ice-options:renomination
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
a=setup:actpass
a=mid:视频
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
a=sendrecv
a=rtcp-mux
a=rtcp-rsize
a=rtpmap:100 VP8/90000
a=rtcp-fb:100 ccm 杉木
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 goog-remb
a=rtcp-fb:100 传输-cc
a=rtpmap:101 VP9/90000
a=rtcp-fb:101 ccm 杉木
a=rtcp-fb:101 nack
a=rtcp-fb:101 nack pli
a=rtcp-fb:101 goog-remb
a=rtcp-fb:101 传输-cc
a=rtpmap:116 红色/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=s-s-rc-group:FID 2034101263 3486873766
a=s-s-rc:2034101263 cname:wYjcft96aVDGkQzC
a=s-s-rc:2034101263 msid:ARDAMS___ ARDAMSv0
a=s-s-rc:2034101263 mslabel:ARDAMS___
a=s-s-rc:2034101263 标签:ARDAMSv0
a=s-s-rc:3486873766 cname:wYjcft96aVDGkQzC
a=s-s-rc:3486873766 msid:ARDAMS___ ARDAMSv0
a=s-s-rc:3486873766 mslabel:ARDAMS___
a=s-s-rc:3486873766 标签:ARDAMSv0
回答 SDP:(来自 Web 浏览器)
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=ice-options:trikle
a=msid-semantic:WMS *
m=音频 9 UDP/TLS/RTP/SAVPF 111 126
c=IN IP4 0.0.0.0
a=recvonly
a=extmap:1 urn:ietf:params:rtp-hdrext:s-s-rc-audio-level
a=fmtp:111 maxplaybackrate=48000;stereo=1;useinbandfec=1
a=fmtp:126 0-15
a=ice-pwd:8a4fad1c837809d3ee952922dbe2b927
a=ice-ufrag:ab799d79
a=mid:音频
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtpmap:126 电话事件/8000/1
a=setup:active
a=s-s-rc:2269112214 cname:b1e7d024-d327-4788-a5b1-a1b8291b5c8d
m=视频 9 UDP/TLS/RTP/SAVPF 100
c=IN IP4 0.0.0.0
a=recvonly
a=fmtp:100 max-fs=12288;max-fr=60
a=ice-pwd:8a4fad1c837809d3ee952922dbe2b927
a=ice-ufrag:ab799d79
a=mid:视频
a=rtcp-fb:100 nack
a=rtcp-fb:100 nack pli
a=rtcp-fb:100 ccm 杉木
a=rtcp-fb:100 goog-remb
a=rtcp-mux
a=rtpmap:100 VP8/90000
a=setup:active
a=s-s-rc: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 s-s-rc don't match
// the new StreamParam.
auto track_it = current_tracks->begin();
while (track_it != current_tracks->end())
【问题讨论】:
【参考方案1】:您的浏览器 SDP 具有 a=recvonly
属性,这意味着本地流未添加到您的对等连接。如果您的浏览器正在向远程发送音频/视频轨道并希望接收远程流,那么它应该在 AnswerSDP 中有a=sendrec
。
【讨论】:
【参考方案2】:通过查看您的答案 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,
);
因此,您的 Answer SDP 应该包含 a=sendonly
行而不是 a=recvonly
。
【讨论】:
【参考方案3】:扩展其他答案:只有在确保您的本地流已被提取并添加到您的 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
是您的信令/连接回调。
【讨论】:
以上是关于Answer SDP 中缺少啥(从 Web 浏览器到 Android 设备)的主要内容,如果未能解决你的问题,请参考以下文章
org.springframework.web.bind.annotation.RequestMapping 缺少啥依赖项?