问题标签 [rtcdatachannel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1732 浏览

blob - WebRTC:何时使用 blob 以及何时为 dataChannel.binaryType 使用 arraybuffer?

要通过 WebRTC/ RTCDataChannel发送二进制数据,可以将 binaryType 设置为“blob”或“arraybuffer”。

我不知道在什么情况下二进制数据应该作为 blob 发送,什么时候作为 ArrayBuffers 发送。有什么提示吗?

0 投票
1 回答
61 浏览

javascript - 测量通过 RTCDataChannel 发送的数据量

我已经通过 RTCdatachannel 连接了两个用户。这可行,但我想监控它产生的流量,例如 1Mbit/s。有没有办法得到这个?

动机是一个用户创建内容,而另一方反映这一点,一种远程支持应用程序。用例需要非常频繁地更新内容(文本、图像、3D 模型)(主要是位置),从而导致流量增加。当它达到某个设定的阈值时,我想降低应用程序发送更新的速率,但为此应用程序需要知道当前消耗的带宽。

我想我可以编写一个间隔来收集在一秒钟内传递给发送函数的所有消息并总结大小,但也许有一些内置的方法?

0 投票
0 回答
370 浏览

webrtc - WebRTC 数据通道上的标准化文件或数据传输

我们正在开发一个 webrtc 应用程序,它使用数据通道来传输数据,尤其是文件。

经过一番调查,我在以下链接中提出了解决方案, https ://webrtc.github.io/samples/src/content/datachannel/filetransfer/ https://www.webrtc-experiment.com/docs/how-文件-广播-works.html

两种解决方案都工作得很好,我计划在那里使用方法,但这里的问题是,两种解决方案都编写了一个文件传输协议,用于分块和重建文件。在这种方法中,接收方必须知道协议并应用该协议的要求。

我打算将文件转换为数据 url 并分成块。在每条消息中,我将发送数据块、块的当前索引和块的总数但是这样我正在编写我的协议,我不能指望第三方应用程序理解我的协议。

我想问的是,webrtc 通道上的数据传输是否有任何标准化?有没有针对它的 RFC?

谢谢和问候, 乌古尔坎

0 投票
1 回答
1446 浏览

javascript - WebRTC dataChannel.readyState 在“连接”上停止

我正在尝试了解如何使用 WebRTC 数据通道,但在测试它们时遇到了一些问题。

我克隆了https://github.com/JustGoscha/simple-datachannel但它似乎不起作用。提供、处理和响应,但 dataChannel.readyState 似乎坚持“连接”。

我能够通过 LAN 让视频/音频正常工作:https ://github.com/shanet/WebRTC-Example 所以我知道我的问题与 NAT 无关(该示例中没有 TURN 服务器)。

为了确认,我编辑了第一个示例,将 dc.html 和 index.html 的第 94 行更改为“iceServers”的空数组,以避免 LAN 上的任何连接问题。

我试图找到一个 dataChannel 的工作实现,没有多个框架或抽象堆叠在上面(我想学习如何使用它们以及它们是如何工作的),但我似乎无法解决我的问题有。

0 投票
1 回答
950 浏览

webrtc - WebRTC RTCDataChannel - 如何配置可靠?

我启动了一个RTCDataChannel,默认情况下它似乎处于不可靠模式。

我想将其配置为可靠以确保数据包传递,但RTCDataChannelInit配置似乎没有为此设置。

此外,RTCDataChannel.isReliable是一个只读属性。

如何将通道配置为可靠模式?

0 投票
1 回答
689 浏览

ios - 当前的 webrtc ios 静态库 - 例如 libwebrtc_arm64.a?

我在浏览器中大量使用WebRTC DataConnection API进行 p2p 通信。现在我想在 iOS 应用程序中做同样的事情。

我在互联网访问速度非常慢的偏远地区生活和发展。因此,我自己构建 webrtc 源代码需要 6+ GB 的下载量来生成静态库是非常困难的。我尝试从不同的位置尝试,但由于构建过程的复杂性失败并且没有时间进行调试。

我找到了libjingle_peerconnection cocoa pod,但它提供的静态库超过 70MB,这对于 iOS 应用程序来说似乎太大了。我想知道它是否包含不必要的 libjingle 和 webrtc 视频(我只想使用 RTCDataChannels)代码?

我只需要一个预建的 iOS arm64 库

0 投票
1 回答
167 浏览

webrtc - RTCDataChannel 使用哪种协议数据包来初始化连接?

我知道 RTCDataChannel 正在使用 SCTP 来初始化连接,但似乎它不使用 SCTP 数据包(具有数据块等)来初始化连接,它使用 SDP 数据包。

当我尝试使用此演示并查看控制台时,它会像这样发送数据包:

据我所知,这是 SDP 数据包的格式。

所以有人可以帮我弄清楚吗?

0 投票
4 回答
4011 浏览

javascript - RTCDataChannel 发送方法不发送数据

我对 RTCDataChannel 有一个奇怪的问题。

我正在对 WebRTC 进行一些研究,并且已经在使用 WebRTC 音频/视频聊天。现在我想使用 RTCDataChannel 向它添加文本聊天和文件共享。

我已经像这样创建了 RTCDataChannel:

我在双方收到的唯一信息是来自dataChannel.onopen第一行的日志。我没有收到来自dataChannel.onmessage的日志。

没有错误..

当我手动调用dataChannel.send结果是一样的。

测试:
谷歌浏览器 (50.0.2661.94)
火狐 (45.0.2)

任何人都可以帮忙吗?

0 投票
1 回答
2903 浏览

javascript - WebRTC DataChannel:在 Firefox 中工作,但不在 Chrome 中

我是 WebRTC 的新手。我正在尝试在两个对等方之间建立一个简单的数据通道,没有音频也没有视频;只是文本数据。最后,它将成为一个游戏,其中 2-7 个对等点将连接到将成为游戏大师的对等点。

经过数小时的谷歌搜索和阅读 html5rocks、MDN 和其他堆栈帖子,我尝试了很多东西,但我仍然无法让它工作。

当我在两个不同的 Firefox 选项卡上打开页面时,一切正常。我可以看到其中一个标签发送“你好,世界!” 并且另一个发送“它有效!”。DataChannel 建立良好,两个选项卡都获得了各自对等方的消息。

但是,在 Chrome 上运行它时,它不起作用。在我的一个测试中,在我能够发送任何东西之前,DataChannel 神秘地关闭了,而在另一个测试中,似乎根本没有调用 RTCPeerConnection.ondatachannel 事件(更多细节在下面)。如果我尝试让 Firefox 与 Chrome 通信,无论顺序如何,我都会收到关于 setRemoteDescription 失败的不同神秘错误。

当然,在这些情况下,我都不会在 web/JavaScript 控制台中收到任何错误消息;这太容易了。

我的问题不在信号传递过程中,至少我不这么认为。一个普通的 WebSocket 用于与一个非常简单的 Node.js 服务器通信。我宁愿避免使用 PeerJS 之类的库。首先是因为我们最好通过手动来学习这件事,其次是因为我想将信令 Node.js 服务器用于其他事情,而不仅仅是信令。这在 Node 端本身不是问题,但它在浏览器端(因为我不会在 100+ KB 的缩小/混淆源代码的海洋中找到一点雨滴)

基本场景非常简单:页面上每 15 秒自动刷新一个当前连接用户列表。通过单击用户名,您可以连接到他,发送“Hello, world!” 当他回答“它有效!”时 同时;暂时就这么吃。简单的聊天文本框当然是下一个合乎逻辑的步骤,一旦我能够建立基本的通信。

更具体地说,如果我是用户 A 并单击用户 B,则应该会发生以下情况:

  1. 通过信令 WebSocket,A 向 B 发送消息,表示他想呼叫他
  2. B 用 WebRTC 报价回复 A
  3. A 获得报价并回复 WebRTC 答案。
  4. 数据通道已建立
  5. 当B端DataChannel打开时,他发送“Hello, world!” 到 A
  6. 当A端的DataChannel打开时,他发送“It works!” 给乙;这可能以相反的顺序发生

    • 无论使用什么浏览器,我应该修改什么才能使其正常工作?(当然我知道它目前仅适用于 Firefox 和 Chrome)
    • 额外的可选问题,为什么我会得到多个 ICE 候选人,尤其是在成功建立连接之后?

我想我应该拥有最新的 Firefox 和 Crhome:resp。45 和 49,在 Windows 7 64 位上。

下面是我的 JavaScript 代码;然后是与一些场景相对应的输出,最后是我通过阅读其他帖子和教程获得的一些想法。

这是firefox连接到firefox时的输出,效果很好:

呼叫者:

称为:

这是 Chrome 连接到 Chrome 时的输出,失败:

呼叫者:

称为:

这是 Firefox 连接到 Chrome 时的输出,失败:

飞狐来电者:

铬调用:

这是 Firefox 以相反方式连接到 Chrome 时的输出,同样失败:Chrome 调用者:

火狐调用:

现在,一些想法:

  1. 我已多次阅读应在发送报价之前创建 DataChannel。因此,我尝试按如下方式修改我的代码以确保是这种情况:

    pc.createOffer(desc=>{ pc.setLocalDescription(desc, _=>say("setLocalDescription 成功"), fail=>say("setLocalDescription failed: " + fail)); say("发送offer到" + o. from); ws.send({type: 'RTCSignal', to: o.from, answer: true, sdp: desc}); }, fail=>say("createOffer failed: "+fail), sdpOptions); pc.channel = createDataChannel(pc, 'chat');

此修改不会更改 Firefox 的任何内容。它继续像以前一样工作。对于 Chrome,它仍然不起作用;但输出不同。以前,在调用 setRemoteDescription 之前,DataChannel 似乎在我能够发送任何东西之前神秘地关闭了。但是,在这种情况下,我没有得到任何消息,DataChannel 保持连接状态。这是输出:

呼叫者:

称为:

无论如何,似乎在这两种情况下都不会调用事件 RTCPeerConnection.ondatachannel 。我有一种感觉,如果我的处理程序从来没有被调用过,或者连接没有建立好,我真的不太清楚。

我还尝试在另一个时刻创建 DataChannel,但没有成功。例如,在双方都调用了 setRemoteDescription 之后。在这种情况下,Firefox 拒绝创建报价,因为我既没有请求音频/视频,也没有请求轨道(我不知道它是什么),也没有 DataChannel(它尚未创建)。所以到目前为止我的结论是,在发送报价之前创建渠道是正确的方法;至少是唯一可以与 Firefox 一起使用的。

我也读过很多次,鉴于我没有要求音频/视频,我没有义务发送报价和答案。但是如果我从我的代码中挤出来,似乎什么也没有发生。没有 ICE 服务器交换等等......在其他地方,我读到在调用 setLocalDescription 之前没有 ICE 服务器启动。所以我必须调用 setLocalDescription,因此我必须创建一个报价。从那里开始,我有义务通过信令通道将它发送给另一个对等方似乎是合乎逻辑的,我有义务调用 setRemoteDescription 然后需要回答。

我在我的代码中使用 sdpOptions = {mandatory: { OfferToReceiveAudio: true, OfferToReceiveVideo: false } };``,虽然我不打算发送音频/视频流。我已经搜索了很多,然后才注意到如果我将它们都设置为 false,那么 Chrome 将永远不会启动它的 ICE 服务器,因此不会有任何 P2P 连接。

还有这个:{DtlsSrtpKeyAgreement: true}, {RtpDataChannels: true }] 我从教程中复制了它,但并不知道它的作用。无论如何,将其全部删除,或将其中一个或另一个设置为 false 不会改变我的结果。

感谢您阅读这么长的帖子。我希望你知道我该如何解决这个问题。请告诉我我应该做什么,或者至少给我一些线索。

非常感谢您的帮助。

编辑:天哪!似乎我所有的代码行都被折叠成一个大行了。非常抱歉,没想到。在小评论中告诉我下次如何解决这个问题。谢谢你。

0 投票
0 回答
338 浏览

ios - WebRTC实时数据通道流控算法?

我正在开发一个带有屏幕共享的 iOS 应用程序。由于 Apple 不支持 iOS 上的 screenshsring,因此唯一的方法是截屏并传输它们。

我正在使用 WebRTC DataChannel 将屏幕截图分享到浏览器。它工作得很好,但需要良好且稳定的上传速度才能工作。

我的问题是网络速度较慢或速度上升和下降时。因为我希望屏幕共享相对实时。需要实施某种流量控制。现在,当连接速度变慢/滞后尖峰时,接收端会出现延迟。

所以当速度较低时,我想减慢每秒发送的屏幕截图。反之亦然。我正在与 ntp 同步时钟,并且在发送截屏时间的那一刻有一个幼稚的实现,并且我编写了一些幼稚的算法。但是它并没有像我需要的那样工作。

有没有什么实时流量控制算法可以推荐给我,或者有什么其他的想法?