Veg*_*ga4 4 javascript google-chrome webrtc
铬合金。
在计算机 A 上生成的 ICE 候选字符串(直接取自 SDP 属性“candidate”):
candidate:2999745851 1 udp 2122260223 192.168.X.1 65398 typ host generation 0 ufrag XBYY network-id 2
Run Code Online (Sandbox Code Playgroud)
现在它通过信令传递,由计算机 B 接收。
计算机 B 收到 (iceStr):
candidate:2999745851 1 udp 2122260223 192.168.X.1 65398 typ host generation 0 ufrag XBYY network-id 2
Run Code Online (Sandbox Code Playgroud)
并尝试let candidate = new RTCIceCandidate(iceStr)
这导致
类型错误:无法构造“RTCIceCandidate”:无法转换为字典。
计算机 B 这样做是为了执行
addIceCandidate(candidate)
Run Code Online (Sandbox Code Playgroud)
在 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>
Run Code Online (Sandbox Code Playgroud)
有想法吗?
所有官方代码示例和文档都指示将该参数发送到远程对等点。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);
}
Run Code Online (Sandbox Code Playgroud)
该值似乎也直接传递给 var candidate = new RTCIceCandidate(msg.candidate);它,最终成为徒劳的练习(相同的错误)。
更新:看起来 API 只理解字符串对象(考虑到事件包含原始类型,这有点遗憾!)即可重现的示例
<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>
Run Code Online (Sandbox Code Playgroud)
但是,即使这样 Chrome 也会产生异常
类型错误:无法构造“RTCIceCandidate”:sdpMid 和 sdpMLineIndex 均为 null。
似乎还有其他“可疑”的事情......比如 WebRTC 提供的内容包含特定于平台的换行符。
RTCSessionDescription 无法直接从事件返回的 SDP Offer 实例化,因为它是 PRIMITIVE 类型,并且 RTCSessionDescription() 需要 String OBJECT。此外,原始类型无法轻松转换为 String,因为它包含特定于平台的换行符,因此简单的 new String(SDP) 会导致格式错误的 String 对象。
任何人?
更新对于 WebRTC Offer,文档没有说明需要向 RTCSessionDescription 提供一个显式 JSON 对象,其中包含类型(蹩脚的“offer”字符串)和 SDP 字段。在整个信令过程中,哪种类型首先隐式强制使用 JSON(低效编码)。(如果有人不自己重建蹩脚的领域,但这与整个地方的黑箱态度相矛盾)
您正在尝试仅使用候选字符串而不是完整对象,其中还包括 sdpMid 和 sdpMLineIndex 属性,请参阅https://developer.mozilla.org/en-US/docs/Web/API/RTCIceCandidate
您可以将 RTCIceCandidate 对象构造为
new RTCIceCandidate({
candidate: 'candidate:2445384676 1 udp 2122194687 192.168.1.26 57088 typ host generation 0 ufrag z1J2 network-id 1 network-cost 10',
sdpMid: 'something', // don't make it up, you get this in onicecandidate
sdpMLineIndex: 12345, // don't make it up, you get this in onicecandidate
})
Run Code Online (Sandbox Code Playgroud)
或者你打电话
pc.addIceCandidate({
candidate: 'candidate:2445384676 1 udp 2122194687 192.168.1.26 57088 typ host generation 0 ufrag z1J2 network-id 1 network-cost 10',
sdpMid: 'something', // don't make it up, you get this in onicecandidate
sdpMLineIndex: 12345, // don't make it up, you get this in onicecandidate
})
Run Code Online (Sandbox Code Playgroud)
这同样适用于 RTCSessionDescription 对象。
| 归档时间: |
|
| 查看次数: |
4272 次 |
| 最近记录: |