WebRTC:确定 PeerConnection 中使用哪个 TURN 服务器

2023-11-21

场景:您想知道 TURN 服务器是否用于特定呼叫,以及您在创建 PeerConnection 期间提供的 TURN 服务器数组中的哪一个正在使用。现在有两个选择:

  • Wireshark:但是当您位于公司代理后面并且 TURN 服务器位于其外部时,wireshark 会将代理 IP 显示为目的地。(更不用说在后台运行它的不便了)
  • 浏览统计页面并发现,chrome --> chrome://webrtc-internals 和 Firefox --> about:webrtc

我想使用上述两种方法的替代方案,以编程方式确定这一点,这样我就不必离开我的申请页面。


Update:我已经更新了示例以遵循最新规范,其中maplike getStats.

下面的方法如下规格目前仅适用于 Firefox,因为 Chrome 实现了getStats()目前不正确。希望有一个版本适配器.jspolyfill 应该很快就会推出,这也将使其在 Chrome 中也能工作。

当你跑步时这把小提琴在 Firefox 中,您会看到:

checking
connected
Does not use TURN

这是因为该示例同时提供了 STUN 和 TURN 服务器。但是当我修改配置以仅使用 TURN 时iceTransportPolicy: "relay", I see:

checking
connected
Uses TURN server: 10.252.73.50

请注意,我使用的转弯服务器位于 VPN 之后,因此它对您不起作用,但请随意使用您自己的服务器修改小提琴(只是不要保存它,除非您希望信息公开!)

虽然我还没有使用多个轮次服务器进行测试,但您可以看到显示的 IP 地址与配置的轮次服务器相匹配,因此应该可以使用这种方法来判断使用的是哪个服务器。

// Turn server is on Mozilla's VPN.
var cfg = { iceTransportPolicy: "all", // set to "relay" to force TURN.
            iceServers: [{ urls: "stun:stun.l.google.com:19302" },
                         { urls: "turn:10.252.73.50",
                           username:"webrtc", credential:"firefox" }] };
var pc1 = new RTCPeerConnection(cfg), pc2 = new RTCPeerConnection(cfg);

pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
pc2.oniceconnectionstatechange = () => log(pc2.iceConnectionState);
pc2.onaddstream = e => v2.srcObject = e.stream;

var findSelected = stats =>
  [...stats.values()].find(s => s.type == "candidate-pair" && s.selected);

var start = () => navigator.mediaDevices.getUserMedia({ video: true })
  .then(stream => pc1.addStream(v1.srcObject = stream))
  .then(() => pc1.createOffer()).then(d => pc1.setLocalDescription(d))
  .then(() => pc2.setRemoteDescription(pc1.localDescription))
  .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(d))
  .then(() => pc1.setRemoteDescription(pc2.localDescription))
  .then(() => waitUntil(() => pc1.getStats().then(s => findSelected(s))))
  .then(() => pc1.getStats())
  .then(stats => {
    var candidate = stats.get(findSelected(stats).localCandidateId);
    if (candidate.candidateType == "relayed") {
      log("Uses TURN server: " + candidate.ipAddress);
    } else {
      log("Does not use TURN (uses " + candidate.candidateType + ").");
    }
  })
  .catch(log);

var waitUntil = f => Promise.resolve(f())
  .then(done => done || wait(200).then(() => waitUntil(f)));

var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
var log = msg => div.innerHTML += msg +"<br>";
var failed = e => log(e +", line "+ e.lineNumber);
<video id="v1" width="108" height="81" autoplay></video>
<video id="v2" width="108" height="81" autoplay></video><br>
<button onclick="start()">Start!</button><br><div id="div"></div>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC:确定 PeerConnection 中使用哪个 TURN 服务器 的相关文章

  • 使用 JavaScript 格式化日期

    JavaScript 中的日期格式有问题 这是我的函数代码 originalDate 2016 03 02 09 12 14 989522 var d new Date originalDate month d getMonth 1 day
  • 如何在 mongodb 聚合管道中使用 Javascript 对象?

    我有一个 JS 对象norm我想在 mongo 聚合管道中使用它 如下所示 var norm 1 1 2 1 16 3 1 413 4 1 622 5 1 6 6 1 753 7 3 001 8 2 818 9 3 291 10 2 824
  • WebRTC 不适用于 Windows

    每当我尝试为 Windows 构建 WebRTC 时 运行 gclient runhooks 时都会收到此错误 running C path to depot tools python276 bin python exe src build
  • 有什么方法可以复制 div 的渲染 HTML 吗?

    我正在开发电子邮件签名生成器 我想通过按按钮复制最终签名 而不是手动选择签名并将其复制到剪贴板 这意味着我需要它们的图像 文本和样式 我尝试了几种变体 包括 w3schools 的变体 但没有成功 其中一些只是复制文本 但没有样式 例子 h
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • 需要参数的addEventListener(和removeEventListener)函数

    我需要向 8 个对象 手掌 添加一些侦听器 这些对象是相同的 但行为必须根据它们的位置而改变 我有以下 丑陋的 代码 root palmsStatus B B B B B B B B if root palmsStatus 0 N root
  • Chrome 开发工具命中代码但未命中断点

    我在 chrome 开发工具上启用了断点 并且在一行上有一个断点 我知道 chrome 正在运行 因为我将断点放在具有以下语句的行上 alert why is this not breaking 如果我在本地主机中找到该文件 则断点有效 断
  • 如何在 jQuery 中将标题转换为 URL slug?

    我正在 CodeIgniter 中开发一个应用程序 我试图在表单上创建一个字段来动态生成URL slug 我想做的是删除标点符号 将其转换为小写 然后用连字符替换空格 例如 Shane s Rib Shack 将变成 shanes rib
  • 仅在 Chrome 上我收到此错误:Uncaught TypeError: Illegal constructor [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我在 Chrome 上加载 jQuery 时 我会收到此错误 Uncaught TypeError Illegal constr
  • “require(...)”是常见的 JavaScript 模式还是库函数?

    我通常发现这是 node js 脚本 模块以及 phantomJS casperJS 等中的第一行 我很好奇 这是否是服务器端 javascript SSJS 的常见模式 类似于 include在 C C 中或import在 Java 中
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • 如何在具有相同值的下拉菜单上触发 jQuery 更改事件

    即使用户选择相同的值 如何每次都触发 jQuery 更改事件 我需要刷新效果 例如如果用户选择Lawyer它会发出警报hello然后用户再次选择Lawyer从下拉菜单中 它应该发出警报hello 我怎样才能实现它 以下是代码 jQuery
  • JSONP 使用 JQuery 从 HTTPS 协议获取 JSON

    我正在尝试获取从 https 安全站点发送的 JSON 客户端希望不要使用任何服务器端语言 全部都是 Javascript 我读到 当使用 Jquery 中的 ajax 函数时 我必须使用 JSONP 才能从安全站点加载 JSON 我的第一
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • D3 向对象添加超链接?

    我正在尝试制作 D3 图 它将代表我网站的菜单 我尝试按照此处的其他指南添加超链接 但它们都不起作用 每个对象都会有一个不同的 URL 指向 主页 关于 联系方式等 如果添加超链接 我可以拖动对象吗 这意味着如果我按住单击 如果我单击该对象
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng
  • 选择单选按钮时隐藏/显示 3 个文本框

    我有 2 个单选按钮 选择一个文本框时 我想显示 3 个文本框 并在选择其他文本框时隐藏它 这是代码 这是我的 2 个单选按钮
  • 在javascript中创建图像的缩略图方块(不丢失纵横比)

    我正在制作一个客户端拖放文件上传脚本作为书签 在上传之前 我使用 File API 将图像读取为 base64 格式并将其显示为缩略图 This is how my thumbnails look like I want them to l
  • 使用 File API polyfill 读取数据 URL

    我正在尝试使用文件 API 库 https github com mailru FileAPI https github com mailru FileAPI 作为不支持文件 API 的浏览器的后备 以便将文件作为数据 URL 读取并将其传
  • 将 JSON 属性绑定到表单

    我有一个 JSON 对象和一个

随机推荐

  • 无需编写控制器的简单 ASP.NET MVC 视图

    我们正在构建一个具有非常少代码的网站 它主要只是提供一堆静态页面 我知道随着时间的推移 情况会发生变化 我们需要交换更多动态信息 因此我决定继续使用 ASP NET MVC2 和 Spark 视图引擎构建一个 Web 应用程序 将有几个控制
  • C#:明确声明“不安全”/编译器选项的好处

    我了解指针以及在 C 代码中使用它们的罕见需求 我的问题是 必须在代码块中明确声明 不安全 背后的原因是什么 此外 为什么必须更改编译器选项以允许 不安全 代码 底线 CLR 或语言规范 中的什么使得我们不能在需要时就使用指针 就像 C 和
  • “您可能需要一个合适的加载器来处理此文件类型”webpack 和 vue

    我正在尝试使用以下命令编译 webpack node modules bin webpack 我收到错误 Module parse failed home vagrant Code stream resources assets js vi
  • jQuery 动画:忽略双击

    我有一个简单的 jQuery 动画 可以在 click 事件发生时将 div 向右或向左移动 但是 如果用户单击该事件两次 则会触发两次 这会扰乱格式 这是我所拥有的示例 a right click function if this is
  • 限制wget可以下载的大小

    是否可以限制或限制数据量wget从网站下载 通过服务器设置或wget环境 例如 一页大小为 1GB 我希望 wget 在 100MB 时停止下载 利用系统通过以下方式限制进程资源消耗的能力ulimit命令应该可以正常工作 假设您使用 bas
  • 在 Mako 中将字符串标记为安全

    我正在使用带有 Mako 模板的 Pylons 并且我想避免一直输入以下内容 h some function that outputs html n 我想以某种方式将函数或变量标记为安全 您可以在 Django 中执行此操作 这样我就不必一
  • 错误:未知选项“--no-crunch”- AAPT 错误

    我昨天下载了最新版本 r14 但在运行任何应用程序时出现此错误 ERROR Unknown option no crunch 请帮忙 我最近遇到了这个问题 但现在是solved 更新到 ADT r14 后 转到Window gt SDK M
  • YouTube 链接的正则表达式

    在我正在开发的系统中 我需要识别以下格式的 YouTube 链接 youtube youtube 网址 youtube 目前我得到了这个正则表达式 youtube http www youtube watch v a zA Z0 9 you
  • 尝试使用模拟在远程计算机上运行 PowerShell 脚本时出现“不允许请求的注册表访问”

    这是我第一次尝试从 C 应用程序执行 PowerShell 脚本 我使用 PowerShell 是因为我需要在远程计算机上执行的 exe 的输出 我能够使用 WMI 在远程计算机上运行 exe 但无法获得所需的输出 无论如何 过去一天左右我
  • 尝试 C 中的 catch 语句

    今天我在想其他语言中存在的 try catch 块 谷歌搜索了一段时间 但没有结果 据我所知 C 中没有 try catch 这样的东西 但是 有没有办法 模拟 它们呢 当然 有断言和其他技巧 但没有像 try catch 那样也能捕获引发
  • Oracle 中的布尔字段

    昨天我想向 Oracle 表添加一个布尔字段 然而 Oracle 中实际上并没有布尔数据类型 这里有人知道模拟布尔值的最佳方法吗 谷歌搜索这个主题发现了几种方法 使用一个整数 并且不要为它分配除 0 或 1 之外的任何值 使用以 Y 或 N
  • python 不接受关键字参数

    我试图让我的代码不接受关键字参数 就像某些公告也不接受关键字参数一样 但是 我无法这样做 根据我有限的理解 这是我的想法 def somefunc a b print a b somefunc 10 20 Output 10 20 现在 当
  • SQL Server - “for json path”语句返回的 JSON 字符串不超过 2984 行

    我正在尝试使用 for json path 语句在复杂且嵌套的 JSON 字符串中生成大量数据 并且我使用多个函数来创建此 JSON 字符串的不同部分 如下所示 declare queue nvarchar max select queue
  • Spinner 绑定到 IntegerProperty

    我想使用 FX8Spinner控件 但我想将源绑定到IntegerProperty int MIN 0 int MAX 5000 int STEP 500 IntegerProperty integerProperty new Simple
  • UWP 应用与 Windows 服务的通信

    我们正在修复应用程序的重新架构 并正在讨论是否可以使用 UWP 来代替普通的 WPF 应用程序 我们的应用程序需要能够访问整个文件系统和所有系统资源 这是一个问题 因为 UWP 应用程序是沙盒的 然而 我们试图通过以下方式解决这个问题 视窗
  • 如何在 folium.circle 地图 python 中的每个圆圈上添加标签

    嘿 我正在尝试将标签添加到 folium circle 地图中 但由于某些原因它不起作用 任何人都可以提供帮助 这是我的地图脚本 import folium Make an empty map m folium Map location 5
  • 同步块可以比 Atomics 更快吗?

    假设以下两个计数器实现 class Counter private final AtomicInteger atomic new AtomicInteger 0 private int i 0 public void incrementAt
  • Visual Studio 2017 (.NET Core) 中的自动版本控制

    我花了几个小时的大部分时间试图找到一种在 NETCoreApp 1 1 Visual Studio 2017 中自动递增版本的方法 我知道 AssemblyInfo cs 是在文件夹中动态创建的 obj Debug netcoreapp1
  • 已编译的 iOS 应用程序 (IPA) 中的内容加密

    由于IPA结构只是一个包含编译代码和图像和音频等媒体内容的压缩文件 我如何保护内容不被他人提取和窃取 我可以在 IPA 中添加任何加密吗 这个答案提到应用程序在进入用户设备时已经加密 Apple 是否会修改提交到 App Store 的应用
  • WebRTC:确定 PeerConnection 中使用哪个 TURN 服务器

    场景 您想知道 TURN 服务器是否用于特定呼叫 以及您在创建 PeerConnection 期间提供的 TURN 服务器数组中的哪一个正在使用 现在有两个选择 Wireshark 但是当您位于公司代理后面并且 TURN 服务器位于其外部时