问题:
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,但他们需要回答这些可能的问题:延迟,整体网络连接稳定性,可扩展性公式(它们不是无限可扩展的).
几点建议
我想收到Android广播消息.是否有所有意图的清单?
<application>
<receiver android:name=".MyBroadcastReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.ACTION_SCREEN_ON"></action>
<action android:name="android.intent.action.ACTION_SCREEN_OFF"></action>
</intent-filter>
</receiver>
...
</application>
Run Code Online (Sandbox Code Playgroud)
MyBroadcastReceiver设置只是为了向日志吐出foo.什么也没做.有什么建议吗?我是否需要分配任何权限来捕获意图?
我正在编写一个小部件,只要用户更改振铃器音量或振动设置,就需要更新.
捕获android.media.VIBRATE_SETTING_CHANGED对于振动设置工作得很好,但我没有找到任何方式在铃声音量变化时得到通知,虽然我可以尝试捕捉当用户按下音量增大/音量减小物理键时,还有很多其他选项在不使用这些键的情况下更改音量.
你知道是否有任何广播行动为此定义或以任何方式创建一个或没有它解决问题?
根据socket.io示例:
要广播,只需添加一个
broadcast标志emit和send方法调用.广播意味着向除了启动它的套接字之外的所有人发送消息.
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
socket.broadcast.emit('user connected');
});
Run Code Online (Sandbox Code Playgroud)
我试图将它与新的socket.io namsepace功能结合起来,所以我得到了这个:
var chat = ioserver.of('/chat');
chat.on('connection', function (socket) {
console.log('chat connection');
socket.on('message', function (msg) {
console.log(msg);
chat.send(msg);
});
});
Run Code Online (Sandbox Code Playgroud)
这很好用,聊天频道(没有其他频道)的每个人都收到消息.但发件人也得到了它.所以我尝试做以下事情:
chat.on('connection', function (socket) {
console.log('chat connection');
socket.on('message', function (msg) {
console.log(msg);
chat.broadcast.send(msg);
});
});
Run Code Online (Sandbox Code Playgroud)
并得到一个异常:'无法调用方法'发送'未定义'.好吧,所以我想,广播是单个套接字的特性(虽然它感觉有点奇怪 - 单个套接字如何能够与其他套接字交换......).所以我尝试过:
chat.on('connection', function (socket) {
console.log('chat connection');
socket.on('message', function (msg) {
console.log(msg);
socket.broadcast.send(msg);
});
});
Run Code Online (Sandbox Code Playgroud)
但现在情况更糟 - 没有人收到邮件,甚至没有收到邮件.无论如何,这是我逻辑上所期望的 - 一个套接字无法通过自身广播.这次没有例外,因此为套接字定义了广播.
如果我做:
chat.on('connection', function (socket) …Run Code Online (Sandbox Code Playgroud) 我试图在选项卡内的两个活动之间传递数据.我正在尝试使用sendBroadcast().设置断点我永远不会到达onReceive().
表现:
<activity
android:name=".WebResults"
android:label="@string/app_name">
<intent-filter>
<action android:name="com.toxy.LOAD_URL" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
活动发件人:
Intent intent=new Intent(getApplicationContext(),WebResults.class);
intent.setAction("com.toxy.LOAD_URL");
intent.putExtra("url",uri.toString());
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
活动接收者:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter filter = new IntentFilter("com.toxy.LOAD_URL");
this.registerReceiver(new Receiver(), filter);
}
private class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
String url = arg1.getExtras().getString("url");
WebView webview =(WebView)findViewById(R.id.webView);
webview.loadUrl(url);
}
}
Run Code Online (Sandbox Code Playgroud) 我有App A和App B.在App中我想向App B发送广播.这是App A的代码:
final Intent intent = new Intent();
intent.setAction("com.pkg.perform.Ruby");
intent.putExtra("KeyName", "code1id");
intent.setComponent(new ComponentName("com.pkg.AppB", "com.pkg.AppB.MainActivity"));
sendBroadcast(intent);
Run Code Online (Sandbox Code Playgroud)
在App B - In中MainActivity,我有MyBroadCastReceiverClass.
public class MainActivity extends Activity {
private MyBroadcastReceiver MyReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Receive broadcast from External App
IntentFilter intentFilter = new IntentFilter("com.pkg.perform.Ruby");
MyReceiver = new MyBroadcastReceiver();
if(intentFilter != null)
{
registerReceiver(MyReceiver, intentFilter);
}
}
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent) { …Run Code Online (Sandbox Code Playgroud) 我想知道服务和广播接收器之间的区别,任何人都可以指出一个可以在Android移动设备上观察到的例子.谢谢
我需要禁用IPv6.为此,java文档表明设置jvm属性java.net.preferIPv4Stack=true.
但我不明白如何从代码本身做到这一点.
许多论坛演示了从命令提示符执行此操作,但我需要在运行时执行此操作.
我相信,我有一个相对常见的火花流用例:
我有一个对象流,我想根据一些参考数据进行过滤
最初,我认为使用广播变量实现这是一件非常简单的事情:
public void startSparkEngine {
Broadcast<ReferenceData> refdataBroadcast
= sparkContext.broadcast(getRefData());
final JavaDStream<MyObject> filteredStream = objectStream.filter(obj -> {
final ReferenceData refData = refdataBroadcast.getValue();
return obj.getField().equals(refData.getField());
}
filteredStream.foreachRDD(rdd -> {
rdd.foreach(obj -> {
// Final processing of filtered objects
});
return null;
});
}
Run Code Online (Sandbox Code Playgroud)
但是,尽管很少,我的参考数据会定期更改
我的印象是我可以在驱动程序上修改和重新广播我的变量,它会传播给每个工作者,但是Broadcast对象不是也不Serializable需要final.
我有什么替代品?我能想到的三个解决方案是:
将参考数据查找移动到一个forEachPartition或forEachRdd左右,使其完全驻留在工作者上.但是,参考数据存在于REST API中,因此我还需要以某种方式存储计时器/计数器以停止对流中的每个元素访问远程数据库.
每次refdata更改时,使用新的广播变量重新启动Spark上下文.
将参考数据转换为RDD,然后join以我现在流式传输的方式将流转换为流Pair<MyObject, RefData>,尽管这会将参考数据与每个对象一起发送.
broadcast ×10
android ×6
java ×2
apache-spark ×1
ipv4 ×1
ipv6 ×1
javascript ×1
node.js ×1
scala ×1
scalability ×1
service ×1
socket.io ×1
video ×1
volume ×1
webrtc ×1