WebRTC:同时重新协商问题

2023-12-06

Use Case:三个同伴正在与同一房间中的另外两个同伴进行视频聊天,服务器发送一条消息,并且所有三个同伴都将模式更改为音频,

目前,只有 chrome 支持重新协商,因此对于 firefox,我只需关闭连接并创建新的对等连接,但在我检查双方都是 chrome 并更改模式后,

  • 如果我一次只更改一个对等点的模式,则效果会很顺利。
  • 但是,当消息来自服务器时,两个对等点都尝试同时重新协商,但没有成功,我得到了类似错误状态的信息:STATE_SENTINITIATE
  • To handle that problem, I did a workaround where, whenever peerconnection has to renegotiate, it checks if it is the caller
    • 如果是,则继续重新谈判。
    • 否则(如果是应答者),它将更改提供的流并通知呼叫者重新协商。
  • 上述解决方法适用于很少的重新协商,但在某些情况下,它会在应答者一侧设置本地描述时抛出错误,声称错误的状态是状态_进行中 or STATE_SENT接受.

我该如何解决这个问题?


由于重新谈判是状态机,让双方同时发起重新协商可能会发生冲突,最终会出现无效状态错误。这就是所谓的glare.

您的解决方法是处理眩光的一种方法,本质上是使用信号来确保重新协商始终从同一端(通常是提供者一侧)发起。

您说即使使用此解决方法,您仍然偶尔会看到无效状态错误。由于重新协商是对等点之间的往返,因此存在一个时间窗口,如果您还响应新重新协商的信令请求,我想如果您过早尝试再次重新协商,您仍然可能会收到无效状态错误。

您可以检查pc.signalingState属性来随时了解您的对等连接处于什么状态。当您收到传入消息时,我会查看一下,看看这是否是问题所在。如果是,我会推迟重新协商,直到您的连接再次处于“稳定”状态。您可以使用pc.onsignalingstatechange对状态变化做出反应。

我听说过(但没有尝试过)的另一个解决眩光的解决方案是让同行独立重新谈判,当他们进行眩光时,让报价者总是获胜。例如应答者将取消其在接收传入报价时所做的任何尝试(通过某种方式将自身恢复到之前的稳定状态),而报价者将在其自己的尝试期间忽略任何传入报价。

顺便说一下,Firefox(38+)现在也支持重新协商,因此您也可以在那里尝试一下,看看是否遇到相同的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC:同时重新协商问题 的相关文章

  • 从立即调用的匿名函数表达式返回 |它去哪里?

    如果我从立即调用的匿名函数表达式返回一个对象 它会去哪里 例如 这段代码中 foo 去了哪里 function var foo return foo 这有什么有用的应用吗 从自执行函数返回一个值而不将该返回值分配给结果变量只是一个无处可去的
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • 检查用户是否连接到 Facebook,然后检查他是否喜欢某个页面

    有没有什么方法可以检查用户是否在我的外部页面上连接到 Facebook 而不让他们允许我的应用程序之一 同样的问题也适用于 检查用户是否喜欢某个页面 我检查了大约 20 个问题和 3 4 个教程 似乎所有问题都在讨论内部脚本 粉丝页面 应用
  • 将 Javascript 变量转换为 PHP 变量

    我想使用由 videoel getCurrentTime 函数返回给我的 javascript 变量 并将其转换为 php 变量 以便我能够将其添加到我的 SQL 插入查询中 例如 INSERT INTO tblData VALUES ph
  • 使用闭包和自调用函数制作计数器

    我想知道为什么这段代码不起作用 var uniqueInteger function var counter 0 return function return counter console log uniqueInteger 0 cons
  • Three.js - 在代码中包含网格数据

    我有这个 Three js 代码 其中 JSON 加载器从文件 models mountain json 加载网格 var Three new function this scene new THREE Scene this camera
  • 从未定义解构时避免错误

    可以说我有这个代码 const x y point Babel 会将其变成 var point point x point x y point y 这很好 但是如果点未定义怎么办 现在我得到一个错误 Cannot read property
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • 在 Angular2 项目中集成 Treant-js

    我正在尝试在 Angular2 项目中使用 treant js 但我正在努力解决如何正确集成它的问题 我有一个工作正常的 JavaScript HTML 示例 我正在尝试在 Angular2 中工作 我创建了一个组件 从 npm 添加了 t
  • 使用 jQuery 仅从字符串末尾修剪空格

    我知道 jQuery trim 函数 但我需要的是一种仅从字符串末尾修剪空格的方法 而不是开头 So str this is a string 会成为 str this is a string 有什么建议么 Thanks 您可以使用正则表达
  • 光滑的轮播缓动示例

    我正在使用 Slick Carousel http kenwheeler github io slick http kenwheeler github io slick 但不知道如何合并不同的幻灯片切换 有人有例子可以分享吗 这是我目前拥有
  • 在 vue.js 模板中包含外部脚本

    我是 Vue js 和 web pack 的新手 所以我决定使用 vue cli webpack 来构建初始应用程序 我试图包含一个外部脚本 例如组件 不需要的模板中 但是 Vue 警告这是不允许的 我的 index html 文件与最初生
  • Chrome Javascript 调试器暂停时不会重新加载页面

    有时 当我在 Chrome 中调试某些 javascript 并且暂停了 javascript 时 如果我尝试重新加载页面 chrome 只会 继续 调试器 单步执行到下一个断点 似乎没有任何方法可以强制 javascript 完全停止运行
  • 对象数组 - 在 Vue.js 生态系统中更新对象的正确方法

    我不确定问题到底出在哪里 但我会看看是否有人可以帮助我理解我的代码出了什么问题 我正在利用 Vuex 商店来跟踪某些不断变化的状态 我这样做如下 import Vue from vue import Vuex from vuex Vue u
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • 为什么我需要 $(document.body) 来使用 Mootools Element 方法扩展 document.body?

    因此 在尝试让我的应用程序在最新的 IE 上运行后 结果发现 IE 不喜欢以下代码 document body getElement className Firefox 和 Chrome 响应良好 但是document bodyIE 上没有
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 有没有办法防止输入 type=“number” 获得多个点值?

    我只想得到十进制值 如 1 5 0 56 等 但它允许多个点 有什么办法可以预防吗 您可以使用pattern属性
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一
  • 获取淘汰赛中被点击元素的索引

    获取无序列表中单击元素的索引的最佳方法是什么 让我举个例子 假设我有以下 HTML 代码 ul li p p li ul 现在我有以下 javascript 代码来获取索引 self itemClicked function data it

随机推荐

  • asp mvc 列出具有动态变化规格的电子商务产品

    我正在尝试为电子商务网站开发产品详细信息页面 假设我们在视图中列出一些产品 现在当用户单击产品时 他会进入产品详细信息视图以显示产品规格 包括添加到购物车 评论等 但这里是产品每个产品的规格都会动态变化 example 服装产品 Size
  • 使用python读取middlebury'flow'文件(字节数组和numpy)

    我正在尝试将 flo 文件读取为 numpy 2Channels 图像 格式描述如下 flo file format used for optical flow evaluation Stores 2 band float image fo
  • 为什么 java 中的操作赋值运算符类型不安全?

    我不确定这个问题是否表述清楚 但举个例子会更清楚 我发现这在 Java 中不起作用 int a a 5 0 但这将 int a a 5 0 即 看起来 运算符是类型安全的 但 不是 这是否有任何深层原因 或者这只是语言设计者必须做出的另一个
  • libGdx 如何使用图像或演员作为主体

    我浏览了 libGdx wiki 教程 但没有找到使用图像或演员作为物理体的示例 在我的游戏中 我在舞台上添加了一名演员 但我想添加这个演员或精灵图像作为物理体 我必须拖动这个演员 甚至想要检测与其他物体的碰撞 如果有请给我参考 Thank
  • 修改shell脚本来监控/ping多个ip地址

    好吧 所以我需要不断监控多个路由器和计算机 以确保它们保持在线 我找到了一个很棒的剧本here如果无法 ping 通单个 IP 它将通过咆哮通知我 这样我就可以在手机上收到即时通知 我一直在尝试修改脚本以 ping 多个地址 但运气不佳 当
  • 执行从 Xib 到 ViewController 的 segue

    我有一个带有按钮的 Xib 文件 单击按钮时我想转到另一个视图控制器 我已经在 StoryBoard 中的视图控制器之间创建了一个 Segue 并创建了一个标识符 但似乎无法以编程方式调用它 IBAction func buttonActi
  • Log4j |更新Appender的日志级别

    我的 log4j properties 文件 log4j rootLogger INFO stdout console output appender log4j appender stdout org apache log4j Conso
  • pandas“DataFrame”对象没有属性“map”

    我有两个 df df a 和 df b df a number cur code 1000 USD 700 2000 USD 800 3000 USD 900 df b number amount deletion code 1000 0
  • 在链接器方法之外将元素的文本存储在 Cypress 中

    如何存储 div 的文本值一次并在整个 cypress 测试中使用它 到目前为止 我已经通过将大部分测试逻辑嵌套在调用中来做到这一点then方法 但这看起来并不优雅或理想 cy get div then div gt let storedV
  • 如何将文件缓冲区转换为 标签 src?

    我正在开发一个应用程序 使用 Node js 作为后端 并作为我的前端进行反应 现在我创建了一个上传文件并将其作为缓冲区类型存储在 mongodb 中的路由 我的问题是 当我在 React 应用程序中收到这些数据时 如何使用这些数据将其转换
  • AVPlayer 无法从本地文件播放 m3u8

    我正在尝试让 AVPlayer 播放本地文件的 m3u8 播放列表 我使用 Apple 的示例播放列表之一将其范围缩小为一个简单的测试用例 https tungsten aaplimg com VOD bipbop adv fmp4 exa
  • 创建实体框架模型时忽略数据库默认值

    假设我的数据库中有下表 CREATE TABLE dbo Test Id INT IDENTITY 1 1 NOT NULL Active BIT DEFAULT 1 NOT NULL When creating an EF model f
  • 学习汇编-echo程序名

    我正在尝试用汇编语言编写一个简单的程序来写出程序的名称 使用 gdb 进行调试 我确定对 sys write 的调用返回 14 EFAULT 我还能够验证我的 strlen 函数是否正常工作 似乎存在某种内存访问问题 但考虑到 strlen
  • 如何让我的 kubernetes 获取最新的 docker 镜像? [复制]

    这个问题在这里已经有答案了 Problem Slack 和 Stack Overflow 上出现的一个常见问题是 当镜像标签未更改但底层镜像已更改时 如何触发 Deployment RS RC 的更新 考虑 存在一个带有映像 foo lat
  • 如何将发件人地址设置为其他gmail中的任何电子邮件(通过Gmail在.NET中发送电子邮件)?

    在这篇文章中通过 Gmail 在 NET 中发送电子邮件我们有一个通过gmail发送电子邮件的代码 在发送邮件中我们从字段中找到包含我使用的gmail帐户我使用相同的代码 但通过将发件人地址更改为我想要的任何电子邮件 并在凭据中设置 gma
  • Spark 2.4 的 lineSep 选项

    Is lineSep该选项确实适用于 Spark 2 4 版本 lineSep default covers all r r n and n defines the line separator that should be used fo
  • 如何修复 - 41:无法从静态上下文引用非静态变量 -> 这是什么原因?

    我正在尝试编写此代码来获取第一个initialCapacity素数 然后使用java按顺序打印它们 它不起作用有两个原因 首先我收到错误 41 不能从静态上下文引用非静态变量 listOfPrimeNumbers 当我尝试运行该程序时 但即
  • 如何获取 SwiftUI Text 中每个字符的位置

    我的第一个想法是基于文本 运算符 似乎很容易 通过组合 一个字符 一个字符 来构建整个文本并检查部分结果的宽度 不幸的是 我没有找到如何做到这一点的方法 所有已知的获取几何图形的技巧 alignmentGuide GeometryReade
  • 套接字关闭并重新绑定 - 如何避免长时间等待?

    我正在 python 中使用套接字 并且在开发阶段我需要经常终止并重新启动我的程序 问题是 一旦杀死了我的 python 脚本 我必须等待很长时间才能重新绑定侦听套接字 这是重现该问题的片段 usr bin env python3 impo
  • WebRTC:同时重新协商问题

    Use Case 三个同伴正在与同一房间中的另外两个同伴进行视频聊天 服务器发送一条消息 并且所有三个同伴都将模式更改为音频 目前 只有 chrome 支持重新协商 因此对于 firefox 我只需关闭连接并创建新的对等连接 但在我检查双方