WebRTC:将视频添加到 SDP 中没有 BUNDLE 行的音频呼叫
Posted
技术标签:
【中文标题】WebRTC:将视频添加到 SDP 中没有 BUNDLE 行的音频呼叫【英文标题】:WebRTC: Adding Video To Audio Call With No BUNDLE Lines in SDP 【发布时间】:2015-03-29 07:54:57 【问题描述】:我希望你们中的一位 WebRTC 专家可以为我指明正确的方向,或者告诉我我正在尝试做的事情在当前的 Chrome 浏览器中是否可行/受支持,或者即使 Chrome 将支持这个用例未来。
我已经搜索了答案并在我的代码中尝试了很多东西,但我无法让以下工作:
我正在尝试进行呼叫升级(将视频添加到现有的纯音频呼叫),在 SDP 中没有捆绑线。我的网络不支持端口捆绑,所以我需要一个 SDP音频和视频端口不同。我想指出,如果我不删除捆绑线(保留默认 SDP),我可以让它工作。
用例:
-
在用户 A 和用户 B 之间设置初始视频通话
用户 A 进行呼叫降级(通过将视频端口设置为 0 来删除视频)
用户 A 进行通话升级(使用新的
getUserMedia
再次添加视频)
用户 B 接受呼叫升级(使用新的getUserMedia
再次添加视频)
注意:在执行任何 _pc.setLocalDescription 之前,我会以这种方式从 SDP 中删除捆绑线:
sessionDescription.sdp = sessionDescription.sdp.replace(/a=group:BUNDLE audio\r\n/g, "");
sessionDescription.sdp = sessionDescription.sdp.replace(/a=group:BUNDLE audio video\r\n/g, "");
这确实有效,因为我在“m=audio”和“m=video”上获得了不同的端口,这是预期的行为。
您可以使用此客户端复制行为(只需按照步骤操作并查看最后一步的控制台日志):
http://webrtc.utopicum.com/
结果:
我无法执行升级,第 4 步失败!!!
基本上,如果调用对“m=audio”和“m=video”行使用相同的端口,浏览器只能连续多次成功执行升级。如果端口不同,则无法从降级呼叫再次传递视频呼叫。
这些是我用来执行升级的详细步骤:
-
新
webkitGetUserMedia(audio: true, video: true, function(stream)...
删除现有流_pc.removeStream(localStream)
添加新流_pc.addStream(stream)
创建新报价_pc.createOffer
移除捆绑线
setLocalSDP_pc.setLocalDescription
获得冰候选人
向远程对等方发送报价
这些是我用来执行降级的详细步骤:
-
创建带有约束的新报价_pc.createOffer
“OfferToReceiveVideo”设置为 false
移除捆绑线
将视频端口设置为 0(另外,请确保我们处于“sendrecv”模式)
setLocalSDP
_pc.setLocalDescription
向远程对等方发送报价
在 LOGS 中,我可以看到我的用例第 4 步的 SDP 缺少 ice-ufrag 和 ice-pwd,并且视频端口设置为 1...
查看升级优惠:
v=0
o=- 4834140171951113916 5 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS z4nWgYpFsPw6UThtfe5tJOwKwfD3WTEl39Dt
m=audio 52158 RTP/SAVPF 111 103 104 0 8 126
c=IN IP4 125.113.122.55
a=rtcp:52159 IN IP4 142.133.123.33
a=candidate:437151159 1 udp 2122260223 142.133.123.33 52158 typ host generation 0
a=candidate:437151159 2 udp 2122260222 142.133.123.33 52159 typ host generation 0
a=candidate:1418565959 1 tcp 1518280447 142.133.123.33 0 typ host tcptype active generation 0
a=candidate:1418565959 2 tcp 1518280446 142.133.123.33 0 typ host tcptype active generation 0
a=ice-ufrag:yTCE4QuOaRby5yJd
a=ice-pwd:KKHBT1dd/0NoScpt8Iiix8ub
a=ice-options:google-ice
a=fingerprint:sha-256 F3:E1:6D:88:FD:B7:DA:55:BB:C8:10:DC:9C:12:C2:9E:C4:E7:49:03:88:C4:7A:10:D1:EA:DA:62:30:85:83:45
a=setup:actpass
a=mid:audio
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=fmtp:111 minptime=10
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:126 telephone-event/8000
a=maxptime:60
a=s-s-rc:2250182501 cname:GVPQmpDpIZXlFcBr
a=s-s-rc:2250182501 msid:z4nWgYpFsPw6UThtfe5tJOwKwfD3WTEl39Dt 4ef7d31c-eae4-4314-9732-6a100b53e42e
a=s-s-rc:2250182501 mslabel:z4nWgYpFsPw6UThtfe5tJOwKwfD3WTEl39Dt
a=s-s-rc:2250182501 label:4ef7d31c-eae4-4314-9732-6a100b53e42e
m=video 52169 RTP/SAVPF 100 116 117 96
c=IN IP4 125.113.122.55
a=rtcp:52170 IN IP4 142.133.123.33
a=candidate:437151159 1 udp 2122260223 142.133.123.33 52169 typ host generation 0
a=candidate:437151159 2 udp 2122260222 142.133.123.33 52170 typ host generation 0
a=candidate:1418565959 1 tcp 1518280447 142.133.123.33 0 typ host tcptype active generation 0
a=candidate:1418565959 2 tcp 1518280446 142.133.123.33 0 typ host tcptype active generation 0
a=candidate:437151159 1 udp 2122260223 142.133.123.33 61801 typ host generation 0
a=candidate:437151159 2 udp 2122260222 142.133.123.33 61802 typ host generation 0
a=candidate:1418565959 1 tcp 1518280447 142.133.123.33 0 typ host tcptype active generation 0
a=candidate:1418565959 2 tcp 1518280446 142.133.123.33 0 typ host tcptype active generation 0
a=ice-ufrag:yTCE4QuOaRby5yJd
a=ice-pwd:KKHBT1dd/0NoScpt8Iiix8ub
a=ice-options:google-ice
a=fingerprint:sha-256 F3:E1:6D:88:FD:B7:DA:55:BB:C8:10:DC:9C:12:C2:9E:C4:E7:49:03:88:C4:7A:10:D1:EA:DA:62:30:85:83:45
a=setup:actpass
a=mid:video
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:14 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
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=rtpmap:116 red/90000
a=rtpmap:117 ulpfec/90000
a=rtpmap:96 rtx/90000
a=fmtp:96 apt=100
a=s-s-rc-group:FID 454679926 4043911517
a=s-s-rc:454679926 cname:GVPQmpDpIZXlFcBr
a=s-s-rc:454679926 msid:z4nWgYpFsPw6UThtfe5tJOwKwfD3WTEl39Dt 09c6faeb-b226-49b0-9ce4-40378af9558e
a=s-s-rc:454679926 mslabel:z4nWgYpFsPw6UThtfe5tJOwKwfD3WTEl39Dt
a=s-s-rc:454679926 label:09c6faeb-b226-49b0-9ce4-40378af9558e
a=s-s-rc:4043911517 cname:GVPQmpDpIZXlFcBr
a=s-s-rc:4043911517 msid:z4nWgYpFsPw6UThtfe5tJOwKwfD3WTEl39Dt 09c6faeb-b226-49b0-9ce4-40378af9558e
a=s-s-rc:4043911517 mslabel:z4nWgYpFsPw6UThtfe5tJOwKwfD3WTEl39Dt
a=s-s-rc:4043911517 label:09c6faeb-b226-49b0-9ce4-40378af9558e
查看浏览器答案:
m=video 1 RTP/SAVPF 100 116 117 96
c=IN IP4 0.0.0.0
a=rtcp:1 IN IP4 0.0.0.0
a=ice-ufrag:
a=ice-pwd:
v=0
o=- 6057878882910049263 5 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS z5IdhGE6udWLNtZ5j1De4o0cKSTc2H4wo3U1
m=audio 52163 RTP/SAVPF 111 103 104 0 8 126
c=IN IP4 125.113.122.55
a=rtcp:1 IN IP4 0.0.0.0
a=candidate:437151159 1 udp 2122260223 142.133.123.33 52163 typ host generation 0
a=candidate:1418565959 1 tcp 1518280447 142.133.123.33 0 typ host tcptype active generation 0
a=ice-ufrag:FjQgNw/qg0UA36ZH
a=ice-pwd:kHYooqwEWmTn7Pco1mh4Af+E
a=fingerprint:sha-256 F3:E1:6D:88:FD:B7:DA:55:BB:C8:10:DC:9C:12:C2:9E:C4:E7:49:03:88:C4:7A:10:D1:EA:DA:62:30:85:83:45
a=setup:active
a=mid:audio
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=fmtp:111 minptime=10
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:126 telephone-event/8000
a=maxptime:60
a=s-s-rc:2432452571 cname:jbVMZw57KYOje031
a=s-s-rc:2432452571 msid:z5IdhGE6udWLNtZ5j1De4o0cKSTc2H4wo3U1 147c3eaf-87cc-457f-bf9c-1610deff30b4
a=s-s-rc:2432452571 mslabel:z5IdhGE6udWLNtZ5j1De4o0cKSTc2H4wo3U1
a=s-s-rc:2432452571 label:147c3eaf-87cc-457f-bf9c-1610deff30b4
m=video 1 RTP/SAVPF 100 116 117 96
c=IN IP4 0.0.0.0
a=rtcp:1 IN IP4 0.0.0.0
a=ice-ufrag:
a=ice-pwd:
a=fingerprint:sha-256 F3:E1:6D:88:FD:B7:DA:55:BB:C8:10:DC:9C:12:C2:9E:C4:E7:49:03:88:C4:7A:10:D1:EA:DA:62:30:85:83:45
a=setup:active
a=mid:video
a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
a=extmap:14 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
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=rtpmap:116 red/90000
a=rtpmap:117 ulpfec/90000
a=rtpmap:96 rtx/90000
a=fmtp:96 apt=100
a=s-s-rc-group:FID 3620434458 3089122764
a=s-s-rc:3620434458 cname:jbVMZw57KYOje031
a=s-s-rc:3620434458 msid:z5IdhGE6udWLNtZ5j1De4o0cKSTc2H4wo3U1 acb064af-1bc3-4d0e-80fe-9ed251bbc8ca
a=s-s-rc:3620434458 mslabel:z5IdhGE6udWLNtZ5j1De4o0cKSTc2H4wo3U1
a=s-s-rc:3620434458 label:acb064af-1bc3-4d0e-80fe-9ed251bbc8ca
a=s-s-rc:3089122764 cname:jbVMZw57KYOje031
a=s-s-rc:3089122764 msid:z5IdhGE6udWLNtZ5j1De4o0cKSTc2H4wo3U1 acb064af-1bc3-4d0e-80fe-9ed251bbc8ca
a=s-s-rc:3089122764 mslabel:z5IdhGE6udWLNtZ5j1De4o0cKSTc2H4wo3U1
a=s-s-rc:3089122764 label:acb064af-1bc3-4d0e-80fe-9ed251bbc8ca
WebRTC -> 无法设置会话描述:无法设置本地应答 sdp:在没有 ice-ufrag 和 ice-pwd 的情况下使用 SDP 调用。
任何帮助将不胜感激!!!
提前致谢!
【问题讨论】:
您好,我已经删除了 SDP 中有问题的部分(请参阅答案 SDP 中的前 5 行)以显示问题。我希望 webRTC 专家 Trent 先生能帮助我! :) 【参考方案1】:我在 webRTC 讨论组中讨论了这个问题,并确定这个问题应该在 Chrome 中作为 TR 提出。
问题来了:
https://code.google.com/p/webrtc/issues/detail?id=4260
【讨论】:
以上是关于WebRTC:将视频添加到 SDP 中没有 BUNDLE 行的音频呼叫的主要内容,如果未能解决你的问题,请参考以下文章
WebRTC 核心功能介绍--一篇读懂SDP PlanB UnifiedPlan(从PlanB迁移到UnifiedPlan)