【发布时间】:2020-11-17 10:06:16
【问题描述】:
Chrome。
计算机 A 上生成的 ICE 候选字符串(直接取自 SDP 属性“candidate”):
candidate:2999745851 1 udp 2122260223 192.168.X.1 65398 typ host generation 0 ufrag XBYY network-id 2
现在通过信令传递,在计算机 B 上接收。
收到计算机 B (iceStr):
candidate:2999745851 1 udp 2122260223 192.168.X.1 65398 typ host generation 0 ufrag XBYY network-id 2
并尝试let candidate = new RTCIceCandidate(iceStr)
这会导致
TypeError:无法构造“RTCIceCandidate”:无法转换为 字典。
计算机 B 这样做是为了执行
addIceCandidate(candidate)
在 RTCPeerConnection 对象上。
但是,由于之前的错误,无法继续。
可重现的示例
<script type="text/javascript">
let c ='candidate:2445384676 1 udp 2122194687 192.168.1.26 57088 typ host generation 0 ufrag z1J2 network-id 1 network-cost 10';
let candidate = new RTCIceCandidate(c);
</script>
想法?
所有官方代码示例和文档都指示将该参数发送到远程对等方。 https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/onicecandidate
然后对弃用(似乎是由其他函数在后台构建)和 JSON 编码存在一些混淆,所以它是哪一个。
来自官方样本: https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling
function handleNewICECandidateMsg(msg) {
var candidate = new RTCIceCandidate(msg.candidate);
myPeerConnection.addIceCandidate(candidate)
.catch(reportError);
}
该值似乎也直接传递给var candidate = new RTCIceCandidate(msg.candidate);,这最终成为徒劳的练习(同样的错误)。
更新: 看起来 API 只能理解 String OBJECT(考虑到 EVENT 包含原始类型,这有点可惜!)即 可重复的样品
<script type="text/javascript">
let c = new String('candidate:2445384676 1 udp 2122194687 192.168.1.26 57088 typ host generation 0 ufrag z1J2 network-id 1 network-cost 10');
let candidate = new RTCIceCandidate(c);
</script>
但是,即使这样 Chrome 也会产生异常
TypeError: 无法构造 'RTCIceCandidate': sdpMid 和 sdpMLineIndex 均为空。
似乎还有其他“值得怀疑”的事情......比如 WebRTC 报价包含特定于平台的换行符。
RTCSessionDescription 不能直接从事件返回的 SDP 报价中实例化,因为它是 PRIMITIVE 类型并且 RTCSessionDescription() 需要 String OBJECT。此外,原始类型不能轻易转换为字符串,因为它包含特定于平台的换行符,因此简单的 new String(SDP) 会导致格式错误的字符串对象。
有人吗?
更新 在 WebRTC 报价的情况下,文档没有说明需要向 RTCSessionDescription 提供包含类型(蹩脚的“报价”字符串)和 SDP 字段的显式 JSON 对象。哪种类型的隐式强制在整个信令过程中首先使用 JSON(低效编码)。 (如果一个人不能自己重建跛脚的领域,但这与到处都是黑箱的态度相矛盾)
【问题讨论】:
标签: javascript google-chrome webrtc