问题标签 [webrtc]

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 投票
4 回答
16702 浏览

sip - 使用 SIP 和 WebRTC 来电

我正在研究实现一个基于浏览器的 VOIP 解决方案,该解决方案使用 SIP 和 WebRTC 并连接到 PTSN。基本上,用户给我他们的 SIP 凭证,我使用 WebRTC 访问他们的麦克风和扬声器。在页面上,我计划运行一个 SIP 客户端。

如何实现来自 PTSN 的来电?我是否需要某种连接到用户的 SIP 服务器的侦听器?

我知道这是一个广泛的问题,但是在网上做了一些研究之后,我仍然对传入呼叫的​​ SIP 实现有些困惑。

0 投票
1 回答
1597 浏览

webrtc - WebRTC + JSEP + Google Channel API - 无法接收remoteStream

我一直在努力解决这个问题,但我不知道出了什么问题,你们能帮帮我吗?我尝试了像这样修改的 WebRTC 代码。

  • 调用者和被调用者都进入网络
  • Web 将根据他们的用户名创建频道
  • 呼叫者单击呼叫按钮并将消息发送到特定频道到某个用户的用户名。当呼叫者单击呼叫按钮时,他然后创建 peerConnection 并添加 localStream
  • 被调用者将收到消息,该过程像 WebRTC 示例代码一样继续进行。当被调用者收到一个offer时,他会创建peerConnection并添加localStream,然后创建并发送answer

我的代码是这样的

当涉及到 waitForRemoteVideo 时,该函数调用 else 条件。但是 remoteVideo 的 blob url 存在。

0 投票
1 回答
4041 浏览

webrtc - 将本地流发送到多个远程对等点

如何将我的本地视频流发送到多个远程对等点?我是否需要为PeerConnection每个远程对等方实例化一个?还是可以同时PeerConnection用于所有远程对等点?

0 投票
3 回答
2814 浏览

webrtc - WebRTC - JSEP:无法在两个不同的网络之间连接对等点

我不知道有没有人发过这个,但我不想问。我的问题是这样的:

  • 我可以使用 apprtc.appspot.com 的两个 Chrome 选项卡(这意味着我称自己)进行视频聊天。一切运作良好。
  • 如果这些笔记本电脑在同一个网络上,我也可以将 apprtc 与两台不同的笔记本电脑一起使用。我在代理后面使用了我大学的网络。
  • 但是,如果我在调制解调器上的一台笔记本电脑和 LAN 上的另一台笔记本电脑上使用它,apprtc 就不起作用。

谁能解释发生了什么?这是 STUN/ICE 问题吗?还是JSEP?

0 投票
1 回答
3021 浏览

webrtc - WebRTC 代码故障排除

我用这个把头发拉出来。大约一个月前,我能够使用 SignalR 的优秀人员提供的一些示例代码,整理出一个概念验证 WebRTC 演示。该演示位于此处,它的源代码在此处,它完成了它应该做的事情。

但是,当我使用该代码并将其移动到我们的实际应用程序中时,我无法让它工作。当然,必须对代码进行重大更改——不同的后端、不同的框架集和支持代码、支持多个同时连接等等——但核心逻辑非常相似。但我无法让它工作。

我在这里整理了一个示例应用程序来演示该问题:

https://bitbucket.org/smithkl42/signalr.webrtc

核心 WebRTC 逻辑都在这个 TypeScript 文件中:

https://bitbucket.org/smithkl42/signalr.webrtc/src/tip/SignalR.WebRTC/Scripts/Media/WebRTC.ts?at=default

它有几百行长,所以我不会在这里发布它,但是您可以通过单击上面的链接来查看它。

当它运行时,它会产生如下输出:

12:17:58.531 WebRTCController.call(): 准备完成后调用 7d9e0d39-5047-4afe-86e5-e6e01b9f5955

12:17:58.533 WebRTCController.prepareForCall():准备通话:localSessionId='39d2df53-6854-415a-8748-b5230eda2eb1'; remoteSessionId='7d9e0d39-5047-4afe-86e5-e6e01b9f5955'

12:18:0.139 Object.():用户已授予媒体设备访问权限,因此继续准备通话

12:18:0.141 Connection.createPeerConnection():创建对等连接;使用 stunServer stun:stun1.l.google.com:19302

12:18:0.144 ():准备工作完成。创建和发送 JSEP 报价。实用程序.js:21

12:18:0.272 Connection.handleIceCandidate():STUN 服务器找到了一个 ICE 候选者(event.type='icecandidate')。

12:18:0.282 Connection.handleIceCandidate():STUN 服务器找到了一个 ICE 候选者(event.type='icecandidate')。

(更像这样)

12:18:0.655 WebRTCController.handleJsepAnswer():处理来自 7d9e0d39-5047-4afe-86e5-e6e01b9f5955 的 JsepAnswer

12:18:0.694 Object.(): 将 ICE 候选发送到远程机器:{"sdpMLineIndex":0,"sdpMid":"audio","candidate":"a=candidate:2999745851 1 udp 2113937151 192.168.56.1 62978类型主机代 0\r\n"}

12:18:0.706 Object.():向远程机器发送 ICE 候选:{"sdpMLineIndex":0,"sdpMid":"audio","candidate":"a=candidate:2999745851 2 udp 2113937151 192.168.56.1 62978类型主机代 0\r\n"}

(更像这样)

但是它永远不会连接,即来自另一端的视频永远不会开始播放。在信令层,我可以通过日志和单步执行代码来判断第一个浏览器正在发送 JSEP 报价;第二个浏览器正在接收它、存储它并发回一个适当的 JSEP 答案;第一台机器正在存储该答案。然后每个 peerConnection 找到 ICE 候选并将它们发送到远程机器;并且每个 peerConnection 都在接收并显然在尝试那些 ICE 候选人;peerConnections 甚至引发了onaddstream事件。但视频永远不会开始播放。

peerConnection 对象的状态一直如下所示:

(iceGatheringState=new; iceState=starting; readyState=active)

令人沮丧的是,每隔一段时间,也许 20 次中就有一次,它确实有效,即两个视频都会出现。所以我没有做错一切。这听起来像是某种时间问题 - 但我无法弄清楚它是什么。据我所知,WebRTC 对象(特别是 RTCPeerConnection)中没有太多可以告诉您出了什么问题。

我不想让其他人为我进行故障排除,但是......好吧,我已经没有选择了。有没有其他人看到我做错了什么?

2012-12-19 更新:我正在取得一些进展。我意识到我正在peerConnection.setLocalDescription()同步调用,即没有指定回调。所以现在我有一些看起来像这样的代码行:

错误回调显示此setLocalDescription()错误:

16:14:42.439 WebRTCController.handleJsepOffer():从创建的答案设置本地描述时出错:SetLocalDescription 失败。answer={"sdp":"v=0\r\no=- 439659381 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE 音频视频\r\ na=msid 语义:WMS u9fhVrWeLLweqb5ubLkw61Ijsh6BM6vZLhjf\r\nm=音频 1 RTP/SAVPF 103 104 111 0 8 107 106 105 13 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:1 IN IP4 0.0。 0.0\r\na=ice-ufrag:vOKflTJ56gV0R9i0\r\na=ice-pwd:9nuXPMDvQ2mZATFCQyEzPRQz\r\na=sendrecv\r\na=mid:audio\r\na=rtcp-mux\r\na=crypto: 1 AES_CM_128_HMAC_SHA1_80 内联:m9q9pmLgLuFnfFC09KXKW5p8TjsKk+VdqX0OWv77\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:111 opus/48000/2\r\na=rtpmap PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:107 CN/48000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\ na=rtpmap:13 CN/8000\r\na=rtpmap:

现在我只需要弄清楚为什么直接来自该createAnswer()方法的特定 SDP 失败了。

2012-12-20 更新:我在此处创建了该问题的在线演示:http: //srdemo.alanta.com/。我还打开了 Chrome 调试日志记录,结果我看到一堆看起来像这样的错误:

[6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null. [6584:7308:1220/091356:ERROR:rtc_peer_connection_handler.cc(84)] Native session description is null.

不确定他们与我的问题有什么关系,但我正在继续调查。

*编辑 2012-12-20:我已经设法(我认为)缩小了问题的范围。有关更精确的详细信息,请参阅此问题

0 投票
1 回答
4019 浏览

signalr - 使用 SignalR 作为 WebRTC 的服务层

这是我提出的另一个问题的后续,但提供了更准确的信息。

我有两个基本相同的网页来演示 WebRTC,一个使用 XSockets 作为后端信号层,一个使用 SignalR 作为后端信号层。

这两个后端基本上是相同的,不同之处仅在于它们(显然)具有不同的方式将数据发送到客户端。同样,两个客户端上的 TypeScript/JavaScript WebRTC 代码完全相同,因为我已经抽象出信号层。

问题是 XSockets 站点始终如一地工作,而 SignalR 站点却失败了(大部分一致,但不完全)。通常调用时会失败peerConnection.setLocalDescription(),但也可以静默失败;或者它(有时)甚至可以工作。

您可以在这里看到两个不同的页面在运行:

XSockets 站点:http: //xsockets.demo.alanta.com/

SignalR 网站:http ://signalr.demo.alanta.com/

两者的源代码都在https://bitbucket.org/smithkl42/xsockets.webrtc,XSockets版本在分支上xsockets,SignalR 版本在signalr分支上。

所以我的问题是:有人知道为什么使用一个信号层而不是另一个信号层会对 WebRTC 产生任何影响吗?例如,是否其中一个或另一个发回 Unicode 字符串而不是 ANSI?还是我误诊了问题,真正的区别在其他地方?

0 投票
1 回答
915 浏览

google-plus - Google+ Hangouts API:访问参与者视频数据并在画布中进行操作

我希望使用 API 创建以下 Google+ Hangouts 应用程序。以下步骤对其进行了描述:

  1. 提供了一个按钮来拍摄参与者视频馈送的快照图像以进行背景减法。
  2. 参与者输入视频源。使用#1 中获得的背景图像处理提要以减去背景。对提要进行处理(例如,使背景为白色,前景为黑色)以获得可以视为图像流的内容。
  3. 来自所有用户的已处理提要(表示为图像流)以编程方式组合在一起并显示在画布上(例如,如果白色为 TRUE,黑色为 FALSE,我可以对所有参与者提要进行像素级逻辑与)。

这可以用当前的 Google+ Hangouts API 来完成吗?如果没有,您能否推荐一个技术套件来执行此操作(我更喜欢 WebRTC,而不必付费通过服务器中继视频数据,即 P2P 或免费基础设施)。

笔记:

我在没有做太多研究的情况下问。

我知道视频源并不完全是图像流,并且会有滞后和一定程度的异步。

0 投票
1 回答
2035 浏览

three.js - Three.js 使用 WebRTC 并应用 Shader

我不知道如何将着色器应用于具有视频纹理的 three.js 对象。

我一直在使用 webRTC 和 three.js,并使用标准材质成功地将视频纹理映射到网格上:

我想更进一步,将着色器(在本例中为 sobel 着色器)应用于此纹理。我的尝试在这里:http: //jsfiddle.net/xkpsE/1/

我收到一堆 INVALID_OPERATION 警告,但无法理解如何调试问题。我也没有看到其他人这样做,所以我认为将这些知识公开是有益的:)

任何帮助,将不胜感激。

0 投票
2 回答
817 浏览

webrtc - WebRTC - 检测相机是否停止

WebRTC 问题

  • 用户相机过早停止流式传输时是否存在事件?

  • WebRTC 可以连接 Peer2Peer Peer1 有一个流和多个观察者查看呢?

谢谢

0 投票
2 回答
6051 浏览

webrtc - 创建 WebRTC PeerConnection 时,我可以跳过 ICE (STUN/TURN) 发现过程吗?

在我的设置中,我在云中有一个自定义服务器来处理音频和视频,所以我不需要(也不想要)整个“我在哪里以及我的私人和公共地址等”。发现过程。本质上我想要 SDP 报价并且不关心 IP 地址/端口;该提议发送到服务器,服务器选择编解码器并获取 SRTP 密钥,并回复一个 SDP 答案给浏览器,其中将包含一个公共地址、编解码器选择和它的密钥。理想情况下,浏览器开始向服务器发送媒体,服务器只需将“对等”媒体从它的来源发送回来(这将通过任何 UDP 友好的 NAT 设备返回)。

我知道这在技术上是可行的,因为我已经用 Win32/OSX 桌面客户端做到了这一点......问题是,这可能用 WebRTCRTCPeerConnection吗?我已经尝试了一些配置类型,例如{}{ "iceServers": [] }但它似乎仍然经历了发现回转。是否有其他方法可以缩短流程?谢谢!