小编igo*_*lov的帖子

WebRTC - 可扩展的直播流广播/多播

问题:

WebRTC为我们提供点对点视频/音频连接.它非常适合p2p通话,环聊.但是广播怎么样(一对多,例如,1到10000)?

假设我们有一个广播员"B"和两个参加者"A1","A2".当然它似乎是可以解决的:我们只用B连接B,然后用A2连接B. 因此B将视频/音频流直接发送到A1,将另一个流发送到A2.B发送两次流.

现在让我们想象有10000名与会者:A1,A2,...,A10000.这意味着B必须发送10000个流.每个流约为40KB/s,这意味着B需要400MB/s的外出网速来维持这种广播.不能接受的.

原始问题(已废除)

是否有可能以某种方式解决这个问题,所以B只在某个服务器上发送一个流,而与会者只是从这个服务器中提取这个流?是的,这意味着此服务器上的传出速度必须很高,但我可以保持它.

或者这可能意味着毁掉WebRTC的想法?

笔记

根据最终客户的不良用户体验,Flash无法满足我的需求.

解决方案(不是真的)

26.05.2015 - 目前没有针对WebRTC的可扩展广播的解决方案,您根本不使用媒体服务器.市场上有服务器端解决方案以及混合(p2p +服务器端,具体取决于不同的条件).

虽然有一些有前途的技术,如https://github.com/muaz-khan/WebRTC-Scalable-Broadcast,但他们需要回答这些可能的问题:延迟,整体网络连接稳定性,可扩展性公式(它们不是无限可扩展的).

几点建议

  1. 通过调整音频和视频编解码器来降低CPU /带宽;
  2. 获取媒体服务器.

javascript video scalability broadcast webrtc

107
推荐指数
6
解决办法
4万
查看次数

Websocket传输可靠性(重新连接时Socket.io数据丢失)

用过的

NodeJS,Socket.io

问题

想象一下,有2个用户U1U2,通过Socket.io连接到应用程序.算法如下:

  1. U1完全失去互联网连接(例如关闭互联网)
  2. U2U1发送消息.
  3. U1尚未收到该消息,因为Internet已关闭
  4. 服务器通过心跳超时检测到U1断开连接
  5. U1重新连接到socket.io
  6. U1从未收到来自U2的消息- 我猜它在第4步丢失了.

可能的解释

我想我明白为什么会这样:

  • 第4步服务器杀死Socket实例和消息队列U1以及
  • 此外,在步骤5 U1服务器上创建新连接(它不被重用),因此即使消息仍然排队,以前的连接仍然会丢失.

需要帮忙

如何防止这种数据丢失?我必须使用hearbeats,因为我没有人永远挂在应用程序中.此外,我仍然必须重新连接,因为当我部署新版本的应用程序时,我希望零停机时间.

PS我称之为"消息"的东西不仅仅是我可以存储在数据库中的文本消息,而是有价值的系统消息,必须保证交付,或UI搞砸了.

谢谢!


增加1

我已经有了一个用户帐户系统.而且,我的申请已经很复杂了.添加离线/在线状态无济于事,因为我已经有了这种东西.问题不同了.

检查第2步.在这一步我们技术上不能说U1是否脱机,他只是失去连接让我说2秒,可能是因为互联网不好.所以U2给他发了一条消息,但U1没有收到它,因为互联网仍在为他服务(步骤3).需要步骤4来检测离线用户,假设超时为60秒.最后,在另一个10秒内,U1的互联网连接正常,他重新连接到socket.io.但来自U2的消息在空间中丢失,因为服务器U1在超时时断开连接.

这是问题,我不是100%交付.


  1. 收集{}用户的emit(发出名称和数据),由随机的emitID标识.发送发射
  2. 确认客户端的emit(使用emitID发送回服务器)
  3. 如果确认 - 从emitID标识的{}中删除对象
  4. 如果用户重新连接 - 请检查此用户的{}并循环执行它,为{}中的每个对象执行步骤1
  5. 在必要时断开连接或/和连接flush {}

    //服务器const pendingEmits = {};

    socket.on('reconnection',()=> resendAllPendingLimits); socket.on('confirm',(emitID)=> {delete(pendingEmits [emitID]);});

    // Client socket.on('something',()=> {socket.emit('confirm',emitID);});

node.js socket.io

72
推荐指数
1
解决办法
2万
查看次数

Redis WATCH MULTI EXEC由一个客户提供

我在RedisOnGo + node_redis上使用NodeJS + Express + Redis作为客户端.我期待很多并发,所以试图测试WATCH.这个例子不包含Express,只是必要的东西.

var redis = require("redis")
var rc = redis.createClient(config.redis.port, config.redis.host)

rc.auth(config.redis.hash, function(err) {
    if (err) {
        throw err
    }
})

rc.on('ready', function () {
    rc.set("inc",0)
    for(var i=1;i<=10;i++){
        rc.watch("inc")
        rc.get("inc",function(err,data){
            var multi = rc.multi()
            data++ // I do know I can use rc.incr(), this is just for example
            multi.set("inc",data)
            multi.exec(function(err,replies){
                console.log(replies)
            })
        })
    }
})
Run Code Online (Sandbox Code Playgroud)

期待结果:在exec回调中得到N个错误,最后得到"inc"变量= 10-N.

意外的结果:在exec回调中得到0错误,但最终得到"inc"变量= 1.

Watch无法使用我的代码.

我发现这个线程redis和watch + multi允许并发用户.他们说这是因为唯一的redis客户端.

然后我发现这个线程我应该为每个连接创建一个新的Redis客户端吗?.他们说为每笔交易生成一个新客户"绝对不推荐".我搞不清楚了.

另请注意,我必须向Redis服务器进行身份验证.提前致谢!

第1版:

通过在每次WATCH-MULTI-EXEC迭代之前创建新的客户端连接,我能够使用本地Redis实例(因此我不使用client.auth).不确定它是否好,但结果现在是100%准确.

版本2 如果我在每次WATCH-MULTI-EXEC迭代之前创建一个新的客户端连接,然后执行client.auth并等待client.on,它就可以工作了. …

javascript redis node.js node-redis

10
推荐指数
1
解决办法
9522
查看次数

WebRTC - CPU减少,设置调整

PRE-SCRIPTUM:

我搜索过StackOverflow并且没有Q/A解释调整WebRTC的所有可能性,以使其更适合最终产品.

问题:

WebRTC有一个非常好的用户体验,它正在削减优势.它应该是完美的网状电话(3-8人),但它还没有.网格调用的最大问题(所有参与者彼此交换流)是资源消耗,尤其是CPU.

以下是我想分享的一些统计数据:

2.3 GHz Intel Core i5(2核),OSX 10.10.2(14C109),4GB RAM,Chrome 40.0.2214.111(64位)

+------------------------------------+----------+----------+
| Condition                          | CPU      | Delta    |
+------------------------------------+----------+----------+
| Chrome (idle after getUserMedia)   | 11%      | 11%      |
| Chrome-Chrome                      | 55%      | 44%      |
| Chrome-Chrome-Chrome               | 74%      | 19%      |
| Chrome-Chrome-Chrome-Chrome        | 102%     | 28%      |
+------------------------------------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

题:

我想创建一个WebRTC调整表,它可以改善资源消耗并提高整体体验.除了下表中的那些设置之外,我还可以使用其他任何设置吗?

+------------------------------------+--------------+----------------------+
| Tweak                              | CPU Effect   | Affects              |
+------------------------------------+--------------+----------------------+
| Lower FPS                          | Low to high  | Video quality lower  |
| Lower …
Run Code Online (Sandbox Code Playgroud)

cpu video performance real-time webrtc

10
推荐指数
1
解决办法
4999
查看次数

Socket.io通过websockets - 随机的"传输结束"断开连接

运用

Web应用程序.NodeJS + Socket.io(仅限websockets,启用心跳).

问题

我的应用程序工作正常(它连接到Socket.io,它正确地发出/接收消息),但我检测到随机断开,而不是因为心跳超时.即使服务器从客户端收到心跳包,仍然可能在几秒钟内断开此客户端.我不明白原因.它几乎是随机发生的,大约每3-15分钟一次.更改socket.io配置似乎不会影响频率.

这是日志,它清楚地表明断开连接的原因不是心跳超时,而是传输端(套接字端):

日志:

debug: emitting heartbeat for client cTVCsv2GS2R_lh3Ecao-
debug: websocket writing 2::
debug: set heartbeat timeout for client cTVCsv2GS2R_lh3Ecao-
debug: got heartbeat packet
debug: cleared heartbeat timeout for client cTVCsv2GS2R_lh3Ecao-
debug: set heartbeat interval for client cTVCsv2GS2R_lh3Ecao-
info: transport end (socket end) 
// ^ Why?
debug: set close timeout for client cTVCsv2GS2R_lh3Ecao-
debug: cleared close timeout for client cTVCsv2GS2R_lh3Ecao-
debug: cleared heartbeat interval for client cTVCsv2GS2R_lh3Ecao-
SOCK 25.12 …
Run Code Online (Sandbox Code Playgroud)

websocket node.js socket.io

8
推荐指数
1
解决办法
3405
查看次数

停止/终止WebRTC媒体流

如何完全杀死WebRTC媒体流?

MediaStream.stop()不再起作用了. 在Chrome 47,Mac OS 10.11中进行测试.

media stream webrtc getusermedia

8
推荐指数
1
解决办法
7526
查看次数

Socket.io发出进度检查

我使用Socket.io上传文件.它适用于以下架构:

  1. 客户端:从输入读取文件并将其编码为Base64并压缩它
  2. 客户端:发送Socket.io事件"上传",包括压​​缩文件作为一段数据
  3. 服务器:收听"上传"事件,解压缩并解码文件并保存

大文件出现问题:我无法看到通过客户端发送的数据进度(就像我使用XHR一样).

要解决这些问题,我必须跟踪(检查)上传事件的上传进度.我怎样才能做到这一点?


我想在CLIENT SIDE上只收听上传进度


感谢bnuhero,socketio-file-upload有可能在服务器端收听进度,并在我们说每上传5%或20%时向客户端发送消息.所以它意味着每个文件分别发送20或5条消息.我想听取客户方面的进展.


看起来没有可能用裸Socket.io检查客户端的进度.Io-stream解决了这个问题.

javascript sockets node.js socket.io

5
推荐指数
1
解决办法
4995
查看次数

深层链接在三星本机应用程序中不起作用

三星 Galaxy S6,Android Marshmallow 6.0。使用 Unity 开发。

三星的应用

深层链接https://开头做的不是工作,而是意图:// 工作:

  • 互联网应用
  • 备忘录应用

谷歌的应用

无论https://开头意图:// 工作:

  • 谷歌浏览器应用
  • Gmail 应用

有关于三星自定义应用程序的信息吗?

代码

资产链接.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.xxx.app",
    "sha256_cert_fingerprints":
    ["4E:CC:14:62:B3:1D:13..."]
  }
}]
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- REPLACE  com.companyname.projectname to your app bundle ID-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxx.app" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0">
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="23"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="1" />
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false"> …
Run Code Online (Sandbox Code Playgroud)

android deep-linking android-intent galaxy

5
推荐指数
1
解决办法
3800
查看次数

Google 表单脚本 ItemResponse getScore() 返回 null

不确定这是否是一个错误,但是该getScore()方法(https://developers.google.com/apps-script/reference/forms/item-response#getscore)总是null为我返回,虽然据说它应该返回A double

该表格一个测验,接受答案,分数设置2为所有问题,分数记录在 Google 表格的回复中。

// Code.gs

function onOpen (e) {
  setOnSubmitTrigger();
}

function setOnSubmitTrigger () {
  var form = FormApp.getActiveForm();

  ScriptApp.newTrigger(respondToFormSubmit)
    .forForm(form)
    .onFormSubmit()
    .create();
}

function respondToFormSubmit (e) {
  var form = FormApp.getActiveForm();
  var allResponses = form.getResponses();
  var response = allResponses[allResponses.length - 1];
  var itemResponses = response.getItemResponses();

  console.log(form.isQuiz()); // yields true

  for (var i in itemResponses) {
    var itemResponse = itemResponses[i];

    Logger.log(itemResponse.getScore()); // (!) …
Run Code Online (Sandbox Code Playgroud)

google-apps-script google-forms google-form-quiz

5
推荐指数
1
解决办法
2093
查看次数

Websockets仅在Socket.io 1.3.4中传输

当我使用Socket.io 0.9.16时,我可以设置所需的和唯一的传输(websockets).不,我升级到版本1(1.3.4)并且无法理解,如何限制传输.

看起来它开始与轮询连接,然后升级到websockets如果"它"想要.我希望它开始并始终只在websockets上工作.

javascript node.js socket.io

4
推荐指数
1
解决办法
1362
查看次数

我应该总是在JavaScript中的所有函数中返回promise吗?

我在想,能在JavaScript函数中返回promises 是一种好方法吗?

让我们假设我们有一个验证用户名的函数的情况.主功能只使用其他2个执行不同检查的功能.

请注意,所有函数名称都只是示例.

// Returns a boolean
function validateUsername (username) {
  return validateUsernameFormat(username) &&
    isUsernameReserved(username);
}

// Returns a boolean
function validateUsernameFormat (username) {
  return typeOf(username) === 'string' &&
    username.match(/^\[a-z0-9]{8,20}$/);
}

// Returns a boolean
function isUsernameNotReserved (username) {
  return ['igor', 'kristina'].indexOf(username) === -1;
}
Run Code Online (Sandbox Code Playgroud)

现在让我们假设我们通过调用API检查我们的数据库中是否已存在给定的用户名来增强我们的验证.

// Now returns a promise
function isUsernameNotReserved (username) {
  return API.checkIfUserNameAlreadyExists(username);
}
Run Code Online (Sandbox Code Playgroud)

这意味着我们现在还必须更改主validateUsername函数,因为它现在还需要返回promise.这也可能意味着我们必须修改所有使用validateUsername函数的函数.

但是,如果我们从头开始承诺所有功能呢?

选项A - 所有函数都返回promise

// Returns a promise
function validateUsername (username) { …
Run Code Online (Sandbox Code Playgroud)

javascript promise

3
推荐指数
1
解决办法
1172
查看次数