gpt4 book ai didi

javascript - 无法创建 RTCDataChannel

转载 作者:行者123 更新时间:2023-12-02 04:19:55 24 4
gpt4 key购买 nike

我正在尝试关注 this example创建数据 channel 。

对于我使用 websockets 的信号,它的行为如下:

User A joins

User B joins
User B asks User A to create an offer
-> A opens datachannel before creating an offer
-> A sets his local description
User A sends his offer to User B
-> B answers the offer
-> B sets local and remote description
User B sends A his local description

(用户 B 不直接向用户 A 发送消息,这是通过带有中间服务器的 websockets 完成的,该中间服务器保存 websocket session ,为简单起见跳过该部分)

用户 A 的创建报价代码如下:
let pc = new RTCPeerConnection({
iceServers: [
{
urls: "stun:stun.l.google.com:19302",
}
]
});
let dc = pc.createDataChannel("Base");
dc.onbufferedamountlow = function(){
console.error("dataChannel.onbufferedamountlow");
};
dc.onclose = function(){
console.error("dataChannel.onclose");
};
dc.onerror = function(){
console.error("dataChannel.onerror");
};
dc.onmessage = function(){
console.error("dataChannel.onmessage");
};
dc.onopen = function(){
console.error("dataChannel.onopen");
};

let offer = await pc.createOffer();
await pc.setLocalDescription(offer);
let offerString = JSON.stringify(pc.localDescription); //Is sent to B

用户 B 的完整代码如下:
let pc = new RTCPeerConnection({
iceServers: [
{
urls: "stun:stun.l.google.com:19302",
}
]
});
await pc.setRemoteDescription(new RTCSessionDescription(offer)); //From A
let answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
let answerString = JSON.stringify(pc.localDescription); //Returns to A

因此,当 A 收到 B 的答案时,它只是:
await pc.setRemoteDescription(new RTCSessionDescription(answer));

A的对象:

A user log

B的对象:

enter image description here

Firefox about:webrtc errors

我也尝试过但没有成功:

- 在两个用户都建立连接后打开数据 channel ,什么都没有,没有任何事件被触发,对此有一些更新:
  • 在两者上创建数据 channel 后,我总是将 readyState 视为正在连接...在两个客户端上...picture of RTCPeer data channel error

  • - 在 A 仍在等待 B 的响应时在 B 上打开数据 channel ,数据 channel onclose 事件被触发,甚至没有触发 open 事件......

    -使用 https://test.webrtc.org/进行测试,结果如下:

    enter image description here

    -我也一直在寻找其他问题或与我的、论坛、博客等类似的问题......所有从 2 到 5 岁的答案似乎都已经过时并且不起作用......

    - 在两侧创建 channel ,如下所示:
    pc.createDataChannel("Test", {
    id: 1,
    negotiated: true,
    })

    导致 OperationError: Id is in use在其中一位客户身上。如何通过 ID if the DOC states this 加入 channel :

    Alternatively (true), they can be negotiated out of-band, where both sides call createDataChannel with an agreed-upon id.



    如果我必须通过 ID 加入 channel ,但在创建对象时我得到该 ID 正在使用中,我该如何加入它?

    如果我没有指定 id,我会得到 TypeError: id is required when negotiated is true
    虽然医生说:

    ID: Optional - An 16-bit numeric ID for the channel; permitted values are 0-65534. If you don't include this option, the user agent will select an ID for you.


  • 添加 await pc.addIceCandidate();await pc.addIceCandidate(null); ,在设置连接本地和远程描述后。
  • 开始我自己的TURN server TCP 和 UDP 同时打开,结果与 Google 的 STUN 服务器相同。
  • 尝试在 iceServer 中同时使用 STUN 和 TURN 服务器.
  • 尝试了 Firefox 和 Chrome 最新版本。

  • 问题:

    1) 数据 channel 何时必须开始打开?在两个客户端都进行了协商并且 pc.connectionState 稳定之后?在创建连接对象之后?设置本地描述之前还是之后?

    最佳答案

    问题是您需要交换 ICE信号上的信息(不仅仅是 SDP 信息)。
    冰是告诉远程对等方知道如何连接,SDP 就像我可以提供什么内容。

    关于javascript - 无法创建 RTCDataChannel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61107353/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com