WebRTC 永远不会在 IceCandidate 上触发

2023-11-22

我开始使用 WebRTC 进行开发,但那东西从来没有给我提供 ICE 候选人。我设置了一切,我正在交换描述和东西,我还在那里缩小了一个超级丑陋的功能,以确保一切都正确运行,一个接一个。两者的信令状态都是稳定的,onError从未被触发(如预期),但 onIceCandidate 也被触发(不按预期),并且当我想发送随机的空 MediaStream 对象时pc1.addStream(new webkitMediaStream());,它总是会触发需要谈判.

有谁知道我的代码到底有什么问题吗?我花了几个小时浏览 Stack Overflow、HTML5 Rocks 和 W3C 文档,但我不明白。这是我的整个代码:

var config={
  'iceServers':[{
    'url':'stun:stun.l.google.com:19302'
  },{
    'url':'stun:stun1.l.google.com:19302'
  },{
    'url':'stun:stun2.l.google.com:19302'
  },{
    'url':'stun:stun3.l.google.com:19302'
  },{
    'url':'stun:stun4.l.google.com:19302'
  }]
};
var pc1=new webkitRTCPeerConnection(config);
var pc2=new webkitRTCPeerConnection(config);

var onError=function(error)
{
  console.error(error);
}

pc1.onicecandidate=function()
{
  console.log('PC1 onIceCandidate (finally) fired!');
}
pc2.onicecandidate=function()
{
  console.log('PC2 onIceCandidate (finally) fired!');
}

pc1.oniceconnectionstatechange=function()
{
  console.log('PC1 oniceconnectionstatechange fired!');
}
pc2.oniceconnectionstatechange=function()
{
  console.log('PC2 oniceconnectionstatechange fired!');
}
pc1.onnegotiationneeded=function()
{
  console.log('PC1 onnegotiationneeded fired!');
}
pc2.onnegotiationneeded=function()
{
  console.log('PC2 onnegotiationneeded fired!');
}

pc1.createOffer(function(offer){
  pc1.setLocalDescription(offer,function(){
    pc2.setRemoteDescription(new RTCSessionDescription(offer),function(){
      pc2.createAnswer(function(answer){
        pc2.setLocalDescription(answer,function(){
          pc1.setRemoteDescription(new RTCSessionDescription(answer),new Function()/*I don't need you, bro*/,onError);
        },onError);
      },onError);
    },onError);
  },onError);
},onError);

顺便说一句,我正在使用 Google Chrome 进行开发。我会确保它也能在 Firefox 中运行,但现在问题应该是跨浏览器。我想先进入数据通道...(但我并不反对使用 Firefox 或跨浏览器代码的工作解决方案)


在 Chrome 38 及更早版本中,OfferToReceiveAudio默认为true。从 Chrome 39 开始,OfferToReceiveAudio默认为 false,正如 WebRTC 工程师在PSA:对 PeerConnection.createOffer 约束 OfferToReceiveAudio 的行为更改(下面引用)。
由于此更改,SDP 返回createOffer不包含任何媒体,因此 ICE 收集过程永远不会启动。您可以通过观察从未触发 ICE 事件以及 PeerConnection 的情况来注意到此更改的后果iceGatheringState and iceConnectionState保持“新”。

为了确保 ICE 收集开始并完成,您必须将媒体添加到您的报价中,例如通过设置OfferToReceiveAudio:true在以下对您的报价的限制中(作为参数PeerConnection构造函数,或作为参数peerConnection.createOffer方法):

{
    mandatory: {
        OfferToReceiveAudio: true
    }
}

(在 SDP 中获取媒体的其他方法包括设置OfferToReceiveVideo:true,或致电peerConnection.addStream使用您从中获得的媒体流getUserMedia)


webrtc-讨论:PSA:对 PeerConnection.createOffer 约束 OfferToReceiveAudio 的行为更改:

我将提交更改(https://webrtc-codereview.appspot.com/16309004/) 更改 RTCPeerConnection.createOffer 的行为。 该更改预计将包含在 Chrome M39 中。

改变了什么:

目前,如果在 PeerConnection.createOffer 中未指定 OfferToReceiveAudio 约束,则即使没有附加到 PeerConnection 的音轨,生成的 Offer SDP 也将具有“m=audio”行。换句话说,OfferToReceiveAudio 默认为 true。

更改后,OfferToReceiveAudio 不再默认为 true。报价 SDP 是否具有“m=audio”行取决于是否有任何音轨已附加到 PeerConnection。

没有改变的是:

为 OfferToReceiveAudio 设置显式值的行为保持不变,即 OfferToReceiveAudio:true 将导致“m=audio”行,无论音轨是否存在; OfferToReceiveAudio:false 将导致没有“m=audio”行,无论是否存在音轨,除非已使用包含“m=audio”行的 SDP 调用 setLocalDescription,在这种情况下,新的 Offer SDP 将标记音频内容不活动而不是删除音频内容。

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

WebRTC 永远不会在 IceCandidate 上触发 的相关文章

随机推荐

  • 使用 page.getMetrics() 获取 puppeteer 中的页面加载时间

    我正在尝试使用 puppeteer 来测量一组网站在我的环境中加载的速度 我关注的是网络连接的质量和网络速度 所以我很高兴知道一个页面访问所花费的时间load 对于负载的外行定义 当所有图像和html都被浏览器下载时 通过使用 puppet
  • 如何获取 Spacy 中的所有名词短语

    我是新来的Spacy我想从句子中提取 所有 名词短语 我想知道我该怎么做 我有以下代码 import spacy nlp spacy load en file open E test txt r doc nlp file read for
  • Spring Web MVC、@ModelAttribute 和 @RequestParam 一起使用

    我有一个带有 GET 方法的控制器 如下所示 Controller public class ThingController RequestMapping value Thing html method RequestMethod GET
  • 如何在多个模块中使用 python 日志记录

    我想知道在 Python 应用程序中执行日志记录的标准设置是什么 我正在使用 Logging 类 并且我已经编写了自己的记录器类来实例化 Logging 类 然后我的 main 实例化我的记录器包装类 但是 我的 main 实例化了其他类
  • 如何在Unity3D输入字段UI组件中使用“On Value Change”

    我正在学习有关如何使用 Unity3d 的教程 但我已经走进了死胡同 我相信新版本的 Unity 中发生了一些变化 因为该教程似乎按照我的方式工作得很好 我有一个输入字段 UI 组件 每次更改它时我都想调用 C 函数 根据教程 我只需使用输
  • 使用 PHP 将文件从一台服务器移动到另一台服务器的最佳方法是什么?

    我想设置一个运行 PHP 脚本的 CRON 该脚本又将 XML 文件 保存非敏感信息 从一台服务器移动到另一台服务器 我已获得正确的用户名 密码 并且想要使用 SFTP 协议 这些作业将每天运行 有可能一台服务器是 Linux 另一台服务器
  • iOS:如何使用 Google Drive sdk 库将文件上传到特定的 Google Drive 文件夹

    我将 Google Drive sdk 与我的 iOS 应用程序集成 但我不知道如何将文件上传到 Google 驱动器特定文件夹 这里的代码用于上传文件 但这是将文件上传到我的谷歌驱动器根文件夹 有人分享一个代码来将文件上传到谷歌驱动器特定
  • 使用 Heroku 的 Git 子模块

    问题 我在 Heroku 上有一个 Rails 3 1 应用程序 它将很快需要一堆 第 3 方 子模块 其中一些有子模块 不幸的是 Heroku 缺乏子模块支持 Heroku 网站上的一项建议是将子模块的内容移至主存储库中 here 第一次
  • pip freeze 列出已卸载的软件包

    在 OS X 10 6 8 上 我使用卸载了一个包 至少 pip 告诉我是这样 sudo pip uninstall pkg name 但当我这样做时包裹仍然出现 pip freeze 我再次尝试执行上面的卸载命令 pip 告诉我该软件包尚
  • 将输入文件替换为表单中我自己的按钮

    基本上我想隐藏输入文件并使用按钮来选择表单中的文件 如果我使用
  • onchange 事件是否传播?

    我使用事件委托来侦听 DOM 中较低层的事件 但它不适用于选择框上的 onchange 事件 onchange 事件是在 DOM 中传播还是冒泡 谷歌搜索未能找到确凿的答案 根据规格 change submit reset应该起泡并且foc
  • 查询Android数据库是否存在!

    我已经为我的 android 应用程序创建了一个数据库 其中包含静态数据并且不需要更新 删除功能 因此当应用程序启动时 我想检查数据库是否存在 如果不存在则执行我的 dbAdapter 类 我知道它是一个简单的 if 语句 但我只是想知道查
  • 您建议使用哪个 CPAN 模块将 HTML 转换为纯文本?

    您建议使用哪个 CPAN 模块将 HTML 转换为格式化纯文本 一项严格的要求是该模块必须处理 Unicode 字符 I like HTML 格式文本 and HTML FormatText WithLinks
  • Angular 2 - 如何为动态加载的组件设置 id 属性

    我在用DynamicComponentLoader加载子组件并生成以下 html
  • 在 std::map 和 std::unordered_map 之间进行选择[重复]

    这个问题在这里已经有答案了 现在std有一个真正的哈希映射unordered map 为什么 或何时 我仍然想使用旧的map over unordered map在它实际存在的系统上 是否有任何我无法立即看到的明显情况 As 已经提到过 m
  • R tm removeWords函数不删除单词

    我试图从我构建的语料库中删除一些单词 但它似乎不起作用 我首先遍历所有内容并创建一个数据框 按频率顺序列出我的单词 我使用此列表来识别我不感兴趣的单词 然后尝试创建一个删除单词的新列表 但是 这些词仍然保留在我的数据集中 我想知道我做错了什
  • 在 JAVA 中使用 JSOUP 从 HTML 中提取 CSS 样式

    任何人都可以帮助使用 Java 中的 Jsoup 从 HTML 中提取 CSS 样式 例如在下面的 html 中我想提取 ft00 和 ft01 div style width 931 height 1243 div
  • WPF:滚动项目控制内容固定标题

    是否可以使用 WPF 的 ItemsControl 执行类似的操作 Demo 我正在尝试冻结 GroupedItems 而不是 GridView 列 资源
  • 如何获取小部件当前的 x 和 y 坐标?

    我目前正在编写一个关于游戏 4 in a row 的游戏项目 为了制作图片小部件磁盘落在列中的动画 我一直在考虑创建一个 while 循环 如下所示 while widgetx and widgety 在空白部分将有我需要获得的值 我的问题
  • WebRTC 永远不会在 IceCandidate 上触发

    我开始使用 WebRTC 进行开发 但那东西从来没有给我提供 ICE 候选人 我设置了一切 我正在交换描述和东西 我还在那里缩小了一个超级丑陋的功能 以确保一切都正确运行 一个接一个 两者的信令状态都是稳定的 onError从未被触发 如预