问题:
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,但他们需要回答这些可能的问题:延迟,整体网络连接稳定性,可扩展性公式(它们不是无限可扩展的).
几点建议
NodeJS,Socket.io
想象一下,有2个用户U1和U2,通过Socket.io连接到应用程序.算法如下:
我想我明白为什么会这样:
如何防止这种数据丢失?我必须使用hearbeats,因为我没有人永远挂在应用程序中.此外,我仍然必须重新连接,因为当我部署新版本的应用程序时,我希望零停机时间.
PS我称之为"消息"的东西不仅仅是我可以存储在数据库中的文本消息,而是有价值的系统消息,必须保证交付,或UI搞砸了.
谢谢!
我已经有了一个用户帐户系统.而且,我的申请已经很复杂了.添加离线/在线状态无济于事,因为我已经有了这种东西.问题不同了.
检查第2步.在这一步我们技术上不能说U1是否脱机,他只是失去连接让我说2秒,可能是因为互联网不好.所以U2给他发了一条消息,但U1没有收到它,因为互联网仍在为他服务(步骤3).需要步骤4来检测离线用户,假设超时为60秒.最后,在另一个10秒内,U1的互联网连接正常,他重新连接到socket.io.但来自U2的消息在空间中丢失,因为服务器U1在超时时断开连接.
这是问题,我不是100%交付.
在必要时断开连接或/和连接flush {}
//服务器const pendingEmits = {};
socket.on('reconnection',()=> resendAllPendingLimits); socket.on('confirm',(emitID)=> {delete(pendingEmits [emitID]);});
// Client socket.on('something',()=> {socket.emit('confirm',emitID);});
我在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,它就可以工作了. …
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) 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) 如何完全杀死WebRTC媒体流?
MediaStream.stop()不再起作用了. 在Chrome 47,Mac OS 10.11中进行测试.
我使用Socket.io上传文件.它适用于以下架构:
大文件出现问题:我无法看到通过客户端发送的数据进度(就像我使用XHR一样).
要解决这些问题,我必须跟踪(检查)上传事件的上传进度.我怎样才能做到这一点?
我想在CLIENT SIDE上只收听上传进度
感谢bnuhero,socketio-file-upload有可能在服务器端收听进度,并在我们说每上传5%或20%时向客户端发送消息.所以它意味着每个文件分别发送20或5条消息.我想听取客户方面的进展.
看起来没有可能用裸Socket.io检查客户端的进度.Io-stream解决了这个问题.
三星 Galaxy S6,Android Marshmallow 6.0。使用 Unity 开发。
深层链接https://开头做的不是工作,而是意图:// 做工作:
无论https://开头和意图:// 做工作:
有关于三星自定义应用程序的信息吗?
资产链接.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) 不确定这是否是一个错误,但是该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) 当我使用Socket.io 0.9.16时,我可以设置所需的和唯一的传输(websockets).不,我升级到版本1(1.3.4)并且无法理解,如何限制传输.
看起来它开始与轮询连接,然后升级到websockets如果"它"想要.我希望它开始并始终只在websockets上工作.
我在想,总能在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 ×5
node.js ×5
socket.io ×4
webrtc ×3
video ×2
android ×1
broadcast ×1
cpu ×1
deep-linking ×1
galaxy ×1
getusermedia ×1
google-forms ×1
media ×1
node-redis ×1
performance ×1
promise ×1
real-time ×1
redis ×1
scalability ×1
sockets ×1
stream ×1
websocket ×1