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 行的音频呼叫的主要内容,如果未能解决你的问题,请参考以下文章

TSINGSEE青犀视频开发webrtc中SDP信息解析

WebRTC:对多个对等连接使用相同的 SDP?

6┃音视频直播系统之 WebRTC 核心驱动SDP规范协商

我如何创建webrtc的仅接收sdp报价?

如何处理C++编译webrtc无法成功获取sdp的问题?

WebRTC 核心功能介绍--一篇读懂SDP PlanB UnifiedPlan(从PlanB迁移到UnifiedPlan)