- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 Web 应用程序,用于使用 WebRTC 的智能手机进行监控,并且我正在使用 socket.io 作为信令服务器。
当我发送流时,我在接收该流的“观看”页面上创建了一个RTCPeerConnection 对象。我在不同的页面上发送流。用户最多可以从智能手机附加四个流,因此在“观看”页面上最多有四个 RTCPeerConnection 对象。
一旦来自“传输”页面的报价出现,就会自动接收流,然后在“观看”页面上创建 RTCPeerConnection 对象并连接到标准 WebRTC 架构。
“传输”页面:
function onCreateOfferSuccess(sdp){
//console.log(sdp);
pc.setLocalDescription(new RTCSessionDescription(sdp));
console.log('ask');
socket.emit('ask', {"sdp":JSON.stringify(pc.localDescription),
"user": loggedUserID,
"fromSocket": ownSocket});
}
“观看”页面:
socket.on('ask', function(offer){
if (offer.user === loggedUserID){
TempDescriptions = JSON.parse(offer.sdp);
console.log(TempDescriptions)
currTransmiterSocket = offer.fromSocket;
console.log(currTransmiterSocket);
getStream();
}
function getStream(){
try {
setTimeout(function(){
console.log(time, 'getStream()');
connection = getPeerConnection();
connection.setRemoteDescription(
new RTCSessionDescription(TempDescriptions),
function() {
connection.createAnswer(gotDescription, function(error){
console.log(error)
});
}, function(error){
console.log(error)
});
}, getStreamDelay*3000)
getStreamDelay++
}
catch(err){
console.log(err);
}
};
我的 Web 应用程序需要这样的功能,当我们退出“观看”页面并再次返回时,必须显示所有先前包含的流。
为了实现此功能,我使用了oniceconnectionstatechange 方法。如果流断开连接,将执行 iceRestart 函数,该函数创建带有选项 {iceRestart: true}
的报价“传输”页面:
var options_with_restart = {offerToReceiveAudio: false,
offerToReceiveVideo: true,
iceRestart: true};
function iceRestart(event){
try{
setTimeout(function(){
pc.createOffer(options_with_restart).then(onCreateOfferSuccess, onCreateOfferError);
},1000);
} catch(error) {
console.log(error);
问题是,当我重新启动“watch”页面时,所有页面“transmit”立即发送请求。尽管同时创建了四个 RTCPeerConnection 对象(假设用户发送了四个流),但只有一个对象已连接。
我已经为这个问题苦恼好几天了。我尝试在后续调用 getStream() 函数时设置增加的时间延迟,如上面的代码所示,我尝试在执行 之前检查 signallingState
连接>getStream() 函数,我尝试了其他几种方法,但均无效。
如果您需要我的代码的某些部分来提供帮助,请写信。
编辑:
“观看”页面中的 gotDescription() 方法。
function gotDescription(sdp) {
try{
connection.setLocalDescription(sdp,
function() {
registerIceCandidate();
socket.emit('response', {"sdp": sdp,
"user": loggedUserID,
"fromSocket": ownSocket,
"toSocket": currTransmiterSocket});
}, function(error){
console.log(error)
});
} catch(err){
console.log(err);
}
}
我添加 console.log
和 RTCPeerConnection 对象
控制台输出: /image/dQXkE.png 1
日志显示连接的signalingState
是“稳定的”,但是当我开发对象时,signalingState
等于“have-remote-offer”
最佳答案
移除TempDescriptions
全局变量,将sdp直接传给getStream(offer.sdp)
。
否则,您 socket.on('ask', function(offer){
调用了 4 次,覆盖了 TempDescriptions
。然后 3 秒后,您的 4 setTimeout
滚动,全部访问 TempDescriptions
的最终值。
这可能就是为什么只有一个 RTCPeerConnection 重新连接的原因。
一般来说,使用时间延迟来分离连接似乎是个坏主意,因为它会减慢重新连接的速度。相反,为什么不发送一个 id
?例如
socket.emit('ask', {id: connectionNumber++,
sdp: JSON.stringify(pc.localDescription),
user: loggedUserID,
fromSocket: ownSocket});
window
添加全局变量每当您像这样分配给未声明的变量时:
connection = getPeerConnection();
...它在 window
上创建一个全局,例如window.connection
,和你有同样的问题。您有 4 个连接,但您将它们存储在一个变量中。
在源文件的开头键入 "use strict";
以捕获此内容:
ReferenceError: assignment to undeclared variable connection
您在这里处理 4 个连接,但您缺少确定每个实例范围的方法。
大多数其他语言会告诉您创建一个类并创建对象实例,然后将包括connection
在内的所有内容放在this
上。这是一个好方法。在 JS 中,您可以改用闭包。但至少您仍然需要 4 个变量来保存 4 个连接,或者一个 connections
数组。然后你抬头——例如来 self 提到的 id
——要处理的连接。
此外,您的 try
/catch
不会捕获异步错误。我强烈建议不要定义所有这些回调,而是 using promises ,甚至 async/await在处理高度异步的 WebRTC API 时。这使得范围界定变得微不足道。例如
const connections = [];
socket.on('ask', async ({user, id, sdp, fromSocket}) => {
try {
if (user != loggedUserID) return;
if (!connections[id]) {
connections[id] = getPeerConnection();
registerIceCandidate(connections[id]);
}
const connection = connections[id];
await connection.setRemoteDescription(JSON.parse(sdp));
await connection.setLocalDescription(await connection.createAnswer());
socket.emit('response', {sdp,
user: loggedUserID,
fromSocket: ownSocket,
toSocket: fromSocket});
} catch (err) {
console.log(err);
}
};
这种错误处理方式是可靠的。
关于javascript - 页面重新加载后连接多个对等连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54613588/
我知道这个问题可能已经被问过,但我检查了所有这些,我认为我的情况有所不同(请友善)。所以我有两个数据集,第一个是测试数据集,第二个是我保存在数据框中的预测(预测值,这就是没有数据列的原因)。我想合并两
在 .loc 方法的帮助下,我根据同一数据框中另一列中的值来识别 Panda 数据框中某一列中的值。 下面给出了代码片段供您引用: var1 = output_df['Player'].loc[out
当我在 Windows 中使用 WinSCP 通过 Ubuntu 连接到 VMware 时,它提示: The server rejected SFTP connection, but it lis
我正在开发一个使用 xml web 服务的 android 应用程序。在 wi-fi 网络中连接时工作正常,但在 3G 网络中连接时失败(未找到 http 404)。 这不仅仅发生在设备中。为了进行测
我有一个XIB包含我的控件的文件,加载到 Interface Builder(Snow Leopard 上的 Xcode 4.0.2)中。 文件的所有者被设置为 someClassController
我在本地计算机上管理 MySQL 数据库,并通过运行以下程序通过 C 连接到它: #include #include #include int main(int argc, char** arg
我不知道为什么每次有人访问我网站上的页面时,都会打开一个与数据库的新连接。最终我到达了大约 300 并收到错误并且页面不再加载。我认为它应该工作的方式是,我将 maxIdle 设置为 30,这意味着
希望清理 NMEA GPS 中的 .txt 文件。我当前的代码如下。 deletes = ['$GPGGA', '$GPGSA', '$GPGSV', '$PSRF156', ] searchquer
我有一个 URL、一个用户名和一个密码。我想在 C# .Net WinForms 中建立 VPN 连接。 你能告诉我从哪里开始吗?任何第三方 API? 代码示例将受到高度赞赏... 最佳答案 您可以像
有没有更好的方法将字符串 vector 转换为字符 vector ,字符串之间的终止符为零。 因此,如果我有一个包含以下字符串的 vector "test","my","string",那么我想接收一
我正在编写一个库,它不断检查 android 设备的连接,并在设备连接、断开连接或互联网连接变慢时给出回调。 https://github.com/muddassir235/connection_ch
我的操作系统:Centos 7 + CLOUDLINUX 7.7当我尝试从服务器登录Mysql时 [root@server3 ~]# Mysql -u root -h localhost -P 330
我收到错误:Puma 发现此错误:无法打开到本地主机的 TCP 连接:9200(连接被拒绝 - 连接(2)用于“本地主机”端口 9200)(Faraday::ConnectionFailed)在我的
请给我一些解决以下错误的方法。 这是一个聊天应用....代码和错误如下:: conversations_controller.rb def create if Conversation.bet
我想将两个单元格中的数据连接到一个单元格中。我还想只组合那些具有相同 ID 的单元格。 任务 ID 名称 4355.2 参与者 4355.2 领袖 4462.1 在线 4462.1 快速 4597.1
我经常需要连接 TSQL 中的字段... 使用“+”运算符时 TSQL 强制您处理的两个问题是 Data Type Precedence和 NULL 值。 使用数据类型优先级,问题是转换错误。 1)
有没有在 iPad 或 iPhone 应用程序中使用 Facebook 连接。 这个想法是登录这个应用程序,然后能够看到我的哪些 facebook 用户也在使用该应用程序及其功能。 最佳答案 是的。
我在连接或打印字符串时遇到了一个奇怪的问题。我有一个 char * ,可以将其设置为字符串文字的几个值之一。 char *myStrLiteral = NULL; ... if(blah) myS
对于以下数据 - let $x := "Yahooooo !!!! Select one number - " let $y := 1 2 3 4 5 6 7 我想得到
我正在看 UDEMY for perl 的培训视频,但是视频不清晰,看起来有错误。 培训展示了如何使用以下示例连接 2 个字符串: #!usr/bin/perl print $str = "Hi";
我是一名优秀的程序员,十分优秀!