问题标签 [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.
sip - 使用 SIP 和 WebRTC 来电
我正在研究实现一个基于浏览器的 VOIP 解决方案,该解决方案使用 SIP 和 WebRTC 并连接到 PTSN。基本上,用户给我他们的 SIP 凭证,我使用 WebRTC 访问他们的麦克风和扬声器。在页面上,我计划运行一个 SIP 客户端。
如何实现来自 PTSN 的来电?我是否需要某种连接到用户的 SIP 服务器的侦听器?
我知道这是一个广泛的问题,但是在网上做了一些研究之后,我仍然对传入呼叫的 SIP 实现有些困惑。
webrtc - WebRTC + JSEP + Google Channel API - 无法接收remoteStream
我一直在努力解决这个问题,但我不知道出了什么问题,你们能帮帮我吗?我尝试了像这样修改的 WebRTC 代码。
- 调用者和被调用者都进入网络
- Web 将根据他们的用户名创建频道
- 呼叫者单击呼叫按钮并将消息发送到特定频道到某个用户的用户名。当呼叫者单击呼叫按钮时,他然后创建 peerConnection 并添加 localStream
- 被调用者将收到消息,该过程像 WebRTC 示例代码一样继续进行。当被调用者收到一个offer时,他会创建peerConnection并添加localStream,然后创建并发送answer
我的代码是这样的
当涉及到 waitForRemoteVideo 时,该函数调用 else 条件。但是 remoteVideo 的 blob url 存在。
webrtc - 将本地流发送到多个远程对等点
如何将我的本地视频流发送到多个远程对等点?我是否需要为PeerConnection
每个远程对等方实例化一个?还是可以同时PeerConnection
用于所有远程对等点?
webrtc - WebRTC - JSEP:无法在两个不同的网络之间连接对等点
我不知道有没有人发过这个,但我不想问。我的问题是这样的:
- 我可以使用 apprtc.appspot.com 的两个 Chrome 选项卡(这意味着我称自己)进行视频聊天。一切运作良好。
- 如果这些笔记本电脑在同一个网络上,我也可以将 apprtc 与两台不同的笔记本电脑一起使用。我在代理后面使用了我大学的网络。
- 但是,如果我在调制解调器上的一台笔记本电脑和 LAN 上的另一台笔记本电脑上使用它,apprtc 就不起作用。
谁能解释发生了什么?这是 STUN/ICE 问题吗?还是JSEP?
webrtc - WebRTC 代码故障排除
我用这个把头发拉出来。大约一个月前,我能够使用 SignalR 的优秀人员提供的一些示例代码,整理出一个概念验证 WebRTC 演示。该演示位于此处,它的源代码在此处,它完成了它应该做的事情。
但是,当我使用该代码并将其移动到我们的实际应用程序中时,我无法让它工作。当然,必须对代码进行重大更改——不同的后端、不同的框架集和支持代码、支持多个同时连接等等——但核心逻辑非常相似。但我无法让它工作。
我在这里整理了一个示例应用程序来演示该问题:
https://bitbucket.org/smithkl42/signalr.webrtc
核心 WebRTC 逻辑都在这个 TypeScript 文件中:
它有几百行长,所以我不会在这里发布它,但是您可以通过单击上面的链接来查看它。
当它运行时,它会产生如下输出:
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:我已经设法(我认为)缩小了问题的范围。有关更精确的详细信息,请参阅此问题。
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?还是我误诊了问题,真正的区别在其他地方?
google-plus - Google+ Hangouts API:访问参与者视频数据并在画布中进行操作
我希望使用 API 创建以下 Google+ Hangouts 应用程序。以下步骤对其进行了描述:
- 提供了一个按钮来拍摄参与者视频馈送的快照图像以进行背景减法。
- 参与者输入视频源。使用#1 中获得的背景图像处理提要以减去背景。对提要进行处理(例如,使背景为白色,前景为黑色)以获得可以视为图像流的内容。
- 来自所有用户的已处理提要(表示为图像流)以编程方式组合在一起并显示在画布上(例如,如果白色为 TRUE,黑色为 FALSE,我可以对所有参与者提要进行像素级逻辑与)。
这可以用当前的 Google+ Hangouts API 来完成吗?如果没有,您能否推荐一个技术套件来执行此操作(我更喜欢 WebRTC,而不必付费通过服务器中继视频数据,即 P2P 或免费基础设施)。
笔记:
我在没有做太多研究的情况下问。
我知道视频源并不完全是图像流,并且会有滞后和一定程度的异步。
three.js - Three.js 使用 WebRTC 并应用 Shader
我不知道如何将着色器应用于具有视频纹理的 three.js 对象。
我一直在使用 webRTC 和 three.js,并使用标准材质成功地将视频纹理映射到网格上:
我想更进一步,将着色器(在本例中为 sobel 着色器)应用于此纹理。我的尝试在这里:http: //jsfiddle.net/xkpsE/1/
我收到一堆 INVALID_OPERATION 警告,但无法理解如何调试问题。我也没有看到其他人这样做,所以我认为将这些知识公开是有益的:)
任何帮助,将不胜感激。
webrtc - WebRTC - 检测相机是否停止
WebRTC 问题
用户相机过早停止流式传输时是否存在事件?
WebRTC 可以连接 Peer2Peer Peer1 有一个流和多个观察者查看呢?
谢谢
webrtc - 创建 WebRTC PeerConnection 时,我可以跳过 ICE (STUN/TURN) 发现过程吗?
在我的设置中,我在云中有一个自定义服务器来处理音频和视频,所以我不需要(也不想要)整个“我在哪里以及我的私人和公共地址等”。发现过程。本质上我想要 SDP 报价并且不关心 IP 地址/端口;该提议发送到服务器,服务器选择编解码器并获取 SRTP 密钥,并回复一个 SDP 答案给浏览器,其中将包含一个公共地址、编解码器选择和它的密钥。理想情况下,浏览器开始向服务器发送媒体,服务器只需将“对等”媒体从它的来源发送回来(这将通过任何 UDP 友好的 NAT 设备返回)。
我知道这在技术上是可行的,因为我已经用 Win32/OSX 桌面客户端做到了这一点......问题是,这可能用 WebRTCRTCPeerConnection
吗?我已经尝试了一些配置类型,例如{}
,{ "iceServers": [] }
但它似乎仍然经历了发现回转。是否有其他方法可以缩短流程?谢谢!