问题标签 [rtcpeerconnection]

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 投票
0 回答
43 浏览

webrtc - 无法在 Chrome 上为本地和远程对等连接获取 Ice Candidates,但是为 Firefox 获取它

我正在尝试在本地同一台机器上使用 WebRTC 进行视频通话。我可以在 Firefox 上看到远程视频。但是我在 Chrome 上看不到它。当我控制台记录我的代码时,我发现它event.candidate同时null适用于localPeerConnection.onicecandidateremotePeerConnection.onicecandidate. 于是,我再次在 Chrome 上测试,发现connectionStatusis"new"iceGatheringStateis "complete"。在尝试 Trickle ICE ( https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ ) 时,我发现我在 Chrome 上没有获得任何冰选项,但适用于 Firefox。

谢谢 :)

这是我的代码

0 投票
1 回答
261 浏览

javascript - 如何使本地网络上的 WebRTC 视频流正常工作?

我正在尝试通过 WebRTC 在两个客户端之间建立对等连接,然后通过连接从摄像头传输视频。问题是,虽然我可以清楚地看到remotePc.ontrack事件被触发,但远程端没有显示视频。也没有抛出错误。我不想使用 icecandidates 机制(并且不应该需要它),因为结果应用程序只会在本地网络上使用(信令服务器只会为客户端交换 SDP)。为什么我的示例不起作用?

0 投票
1 回答
196 浏览

webrtc - 我应该在添加我方的 localMedia 曲目之前发送 WebRTC 答案吗?

我正在使用 WebRTC 构建一个视频通话应用程序,它允许一个对等方通过在大厅中选择某人来呼叫另一个。当对等体 A 发送呼叫请求时,其他对等体 B 可以接受。此时,WebRTC 信令开始:

  • 双方都使用 MediaDevices.getUserMedia() 获取他们的本地媒体
  • 两个对等点都创建一个 RTCPeerConnection 并附加事件侦听器
  • 双方都调用 RTCPeerConnection.addTrack() 来添加他们的本地媒体
  • 一个对等点 A(不礼貌的用户)创建一个报价,调用 RTCPeerConnection.setLocalDescription() 将该报价设置为本地描述,并将其发送到 WebSocket 服务器,该服务器将其转发给另一个对等 B。
  • 另一个peer B收到这个offer,添加调用RTCPeerConnection.setRemoteDescription()记录为远程描述
  • 然后另一个对等方 B 创建一个答案并将其再次传输给第一个对等方 A。

(基于https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Connectivity的步骤)

这个流程几乎运行良好。在 10 次通话中,有 1 次没有收到来自其中一位同伴的视频/音频(而两位同伴都有可用的本地视频)。在这种情况下,我注意到 SDP 包含的答案a=recvonly应该是a=sendrecv在正常情况下。我进一步确定,当对方收到offer需要回复的时候,这边的localMedia有时还没有添加,因为MediaDevices.getUserMedia可能需要一段时间才能完成。我还通过记录并观察报价有时在添加本地曲目之前到达来确认此操作顺序。

我假设在添加本地媒体之前我不应该发送答案?

我正在考虑两种方法来解决这个问题,但我不确定哪个选项是最好的,如果有的话:

  • 仅在 MediaDevices.getUserMedia() 完成后创建 RTCPeerConnection。同时,当接收到一个 offer 时,还没有对等连接,所以我们将 offer 保存在缓冲区中,以便在创建 RTCPeerConnection 后处理它们。
  • 当收到一个报价,并且还没有 localMedia 轨道时,请推迟创建答案,直到添加 localMedia 轨道。

我很难决定哪种解决方案(或另一个)最适合“完美谈判”模式。

提前致谢!

0 投票
0 回答
63 浏览

android - 需要协商错误 => 无法解析 SessionDescription。使用内容名称添加传输信息失败:0

我正在尝试制作webRTC应用程序。如果使用旧版浏览器,我的实验会失败。这是一张支票:

  1. (android crosswalk) => 5.0 (Linux; Android 5.1; S960 Build/LMY47D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Crosswalk/23.53.589.4 Safari/537.36
  2. (桌面) => 5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/91.0.4472.124 Safari/537.36

我可以成功实例化调用(请求并接受它)。第一次展示相机 - 没有问题。

问题是:从 PC 切换相机后,如预期的那样触发“negotiationneeded”。当接收到1(android)remoteSDP时:

  1. pc.setRemoteDescription -- 好的
  2. pc.createAnswer -- 好的
  3. setLocalDescription -- 添加 answerSDP 时失败(上一步)

这里是:answerSDP

PS:英语,不是我的母语。

0 投票
1 回答
59 浏览

javascript - WebRTC - 创建 RTC 数据通道的正确方法是什么?

我在需要创建数据通道的时候使用 WebRTC JS 应用程序和 stcuk。我有这部分代码实际上可以工作,但是 openRTCDataChannel 方法被执行了两次:

如果我评论第一次或第二次调用 openRTCDataChannel 方法,我的一些同行可以在他们之间交换数据,而有些则不能。

所以问题是,如果我想让我的代码工作,我需要以两种不同的方式执行两次 openRTCDataChannel 方法。我做错了什么,启动适用于所有浏览器的数据通道的最佳方法是什么?

任何帮助表示赞赏!

0 投票
0 回答
147 浏览

webrtc - 在 MediaStream 上使用虚拟轨道进行 p2p 视频通话时遇到问题 - WebRTC

我目前正在使用 peerjs 和一些原始 RTCPeerconnection API 方法开发 p2p 视频通话应用程序。当本地用户不提供媒体权限时,当我需要为与远程用户的初始连接创建一个虚拟媒体流时,我使用了虚拟轨道(即从画布捕获Stream 用于视频,并使用AudioContext 用于音频)。现在,在通话过程中,当用户授予权限时,我必须从本地媒体流中删除 canvasCaptureMediaStreamTrack 并从用户设备添加新的视频流。

在此过程中,从本地流中删除 canvasCaptureMediaStreamTrack 时,浏览器会抛出错误TypeError: Failed to execute 'removeTrack' on 'MediaStream': parameter 1 is not of type 'MediaStreamTrack'

0 投票
1 回答
115 浏览

stream - RTCPeerConnection replaceTrack 仅更改远程对等方的流

我是 RTCPeerConnection (WEBRTC) 的新手,所以请多多包涵。

到目前为止,我能够通过在我的应用程序中切换相机或屏幕共享来替换运行中的轨道。但我注意到在 2 个浏览器选项卡中,新替换的跟踪流仅在合作伙伴/远程对等方中捕获,而不是在发起者的选项卡上。即使流已被替换,它仍会继续显示旧流。

如果发起人也能看到他/她正在分享的内容,那就太好了。我试过了,但到目前为止还没有运气。寻求一些帮助。

我的代码如下所示:

提前致谢。

0 投票
0 回答
82 浏览

javascript - “信号状态改变”事件如何在 webRTC 连接中起作用?

我正在努力在用户之间进行简单的 webRTC 文本通信。我的设计是在用户通过信令服务器登录时创建一个 RTCpeerconnection。之后,每当任何用户想要与其他用户创建聊天时,他们都可以通过信令服务器发送提议并相互回答。这可以通过信令服务器来实现。以下是我目前用于报价的一段代码。

提供创作者

在以下场景中,我在创建报价时遇到了问题。

设想:

错误

我收到错误消息InvalidStateError: Cannot create offer in have-remote-offer (我正在使用Firefox浏览器)

之后,我研究了 RTCpeerConnection 信令状态。现在我已经明白调用setLocalDescription(或setRemoteDescription)将更signaling state改为"have-local-offer"(或"have-remote-offer")。

现在在我的情况下,如果用户 A 向用户 B 发送报价并且用户 B 拒绝它。然后用户 A 仍处于“有远程报价”状态。所以在状态改变之前,任何其他用户都不能提供新的报价。

所以现在我想知道如何使用相同的 RTCpeerconnection 为新报价做出或强制signaling state执行stableclosed

peerConnection.signalingState = 'closed';当用户拒绝报价时,我可以强行喜欢吗?有什么建议吗?如果我的理解有误,请纠正我。

0 投票
1 回答
92 浏览

swift - Webrtc Swift - 线程 1:EXC_BAD_ACCESS(代码=1,地址=0xd000000000000040)

我正在使用带有 Webrtc 的 Janus videoroom。一切正常。但是当我去结束通话时。并关闭当前的视图控制器 - 应用程序崩溃。

我无法理解崩溃的问题,所以我可以解决。

当前视图消失也很好。日志显示了这一点:

我在 Appdelegate 的第一行遇到了崩溃:

我还附上了回溯日志以获取更多信息。但这对我没有任何意义:

0 投票
1 回答
125 浏览

javascript - 我可以将 webRTC Peer Connection 对象重新用于多用户聊天吗?

我已经用于WebRTC我的聊天应用程序。我的想法是,只要有任何用户加入聊天应用程序,RTCPeerConnection就会创建一个新对象。聊天室将只允许one-to-one communication

示例:假设User1,User2User3加入了应用程序。如果user1想与之聊天,user2则将在这些用户之间创建一个房间。

这里user1RTCPeerConnection并且user2有它自己的RTCPeerConnection。接下来webRTC negotiation(交换要约、回答和 ICE)将通过信令在它们之间发生。数据可以通过 RTC 数据通道共享。

如果user1要连接user3,则user1必须离开之前的房间并与之进行 webRTC 协商user3(意味着之前的房间删除和新的房间必须创建)。

现在我的问题是

假设user1然后user2正在做 webRTC 通信

用户 1 RTCPeerConnection.signalingstatechange = have-local-offer

用户 2 RTCPeerConnection.signalingstatechange = have-remote-offer

之后我关闭了连接(意味着删除了房间)。接下来user1要连接user3

在这种情况下,我可以重新使用 User1RTCPeerConnection来创建新的报价user3吗?

如果是,在删除以前的连接期间我必须注意哪些事项?因为前一个signalingstatechangehave-local-offerand have-remote-offer。有什么帮助或建议吗?