因此,我希望建立一个允许视频,音频和文本的聊天应用程序.我花了一些时间研究Websockets和WebRTC来决定使用哪个.由于WebRTC有很多视频和音频应用程序,这听起来是一个合理的选择,但还有其他我应该考虑的事情吗?随意分享您的想法.
像:
由于新的WebRTC仅在某些浏览器上可用,而websockets似乎在更多的浏览器中.
可伸缩性 - Websockets使用服务器进行会话,而WebRTC似乎是p2p
多路复用/多个聊天室 - 用于Google+环聊,我仍然可以查看有关如何实施的演示应用
服务器 - Websockets需要RedisSessionStore或RabbitMQ来扩展多台计算机
我们无法使用WebRTC或文件输入从iOS11(公开发布)主屏幕Web应用程序访问相机,详情如下.我们的用户如何继续访问相机?
我们通过https提供网络应用页面.
正如这里的人们所说,Apple docs建议网络应用程序相机功能在11.3与服务工作者一起返回.这很好,但我们还不确定是否我们希望每个人都重新安装,直到我们可以对11.3GM进行彻底测试.
iOS 11.2和iOS 11.1.2无法修复.
似乎我们可以向Web应用程序的现有客户询问
我们当前的生产代码使用的文件输入在iOS 10及更早版本中运行良好多年.在iOS11上,它可用作Safari选项卡,但不能用于主屏幕应用程序.在后一种情况下,相机被打开并且仅显示黑色屏幕,因此它是不可用的.
<meta name="apple-mobile-web-app-capable" content="yes">
...
<input type="file" accept="image/*">
Run Code Online (Sandbox Code Playgroud)
iOS11上的Safari 11提供WebRTC媒体捕获功能,非常棒.
我们可以使用navigator.mediaDevices.getUserMedia根据此处链接的示例代码,在桌面和移动设备上的普通网页上捕捉相机图像到画布.
当我们将页面添加到iPad或iPhone主屏幕时,navigator.mediaDevices变得undefined无法使用.
<meta name="apple-mobile-web-app-capable" content="yes">
...
// for some reason safari on mac can debug ios safari page but not ios home screen web apps
var d = 'typeof navigator : ' + typeof …Run Code Online (Sandbox Code Playgroud) 我使用以下JavaScript代码打开了一个网络摄像头: navigator.getUserMedia
是否有任何JavaScript代码可以停止或关闭网络摄像头?感谢大家.
问题:
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,但他们需要回答这些可能的问题:延迟,整体网络连接稳定性,可扩展性公式(它们不是无限可扩展的).
几点建议
我想记录用户网络摄像头和音频,并将其保存到服务器上的文件中.然后,这些文件可以提供给其他用户.
我没有播放问题,但是我在录制内容方面遇到了问题.
我的理解是.record()还没有编写getUserMedia 函数 - 到目前为止只提出了一个提议.
我想使用PeerConnectionAPI在我的服务器上创建一个对等连接.我知道这有点hacky,但我认为应该可以在服务器上创建一个peer并记录client-peer发送的内容.
如果可以,我应该能够将此数据保存为flv或任何其他视频格式.
我的偏好实际上是记录网络摄像头+音频客户端,以允许客户端在上传前不喜欢他们的第一次尝试时重新录制视频.这也将允许网络连接中断.我已经看到一些代码允许通过将数据发送到画布来记录网络摄像头中的各个"图像" - 这很酷,但我也需要音频.
这是我到目前为止的客户端代码:
<video autoplay></video>
<script language="javascript" type="text/javascript">
function onVideoFail(e) {
console.log('webcam fail!', e);
};
function hasGetUserMedia() {
// Note: Opera is unprefixed.
return !!(navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia);
}
if (hasGetUserMedia()) {
// Good to go!
} else {
alert('getUserMedia() is not supported in your browser');
}
window.URL = window.URL || window.webkitURL;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
var video = document.querySelector('video');
var …Run Code Online (Sandbox Code Playgroud) 这听起来像一个非常基本的问题,但我需要确认
我问这个是因为我知道浏览器对并行连接的数量有限制(我认为他们谈论TCP),并且UDP连接可能不受限制.
我正在测试WebRTC AGC,但我必须做错了,因为信号只是通过未经修改的.
以下是我创建和初始化AGC的方法:
agcConfig.compressionGaindB = 9;
agcConfig.limiterEnable = 1;
agcConfig.targetLevelDbfs = 9; /* 9dB below full scale */
WebRtcAgc_Create(&agc);
WebRtcAgc_Init(agc, minLevel, maxLevel, kAgcModeFixedDigital, 8000);
WebRtcAgc_set_config(agc, agcConfig);
Run Code Online (Sandbox Code Playgroud)
然后对于每个10ms样本块,我执行以下操作:
WebRtcAgc_Process(agc, micData, NULL, 80, micData, NULL, micLevelIn, &micLevelOut, 0, &saturationWarning);
Run Code Online (Sandbox Code Playgroud)
其中micLevelIn设置为0.
谁能告诉我我做错了什么?
我预计全量级正弦音将衰减到目标DBFS级别; 并且将放大低电平正弦音(即-30dBFS)以匹配目标DBFS电平.但那不是我所看到的.
这更像是一个概念性问题而不是直接"如何做到这一点".
通常是否可以实现类似flash的解决方案来流式传输音频(独立于我们从HTMLR和nodeJS/binaryJS中获取流数据的位置,例如webRTC或其他).如果是这样,你会怎么做?
从2010年开始,这里只发现了一个关于stackoverflow的问题.从那时起,NodeJS和HTML5已经发展壮大.
人们通常做什么: 当使用多媒体流(即视频或音频)到服务器时,在当前时间点肯定没有任何东西可以击败闪存,直到getUserMedia()完全到达- 这可能需要一段时间直到99浏览器用户的百分比将完全使用它.
将数据流式传输到服务器的一般做法是使用客户端Flash或Flex应用程序,然后连接到RT5协议驱动的介质服务器,如RED5,FMS或Wowza.例如,通过RTMP发送麦克风输入的客户端应用程序可能看起来像(简化版)
import flash.net.NetStream;
private var myMic:Microphone;
private var nc:NetConnection;
private var ns:NetStream
nc = new NetConnection();
ns = new NetStream(nc);
nc.connect(rtmp://localhost/serverApp);
myMic = Microphone.getMicrophone();
ns.attachAudio(myMic);
Run Code Online (Sandbox Code Playgroud)
与服务器应用程序一起,可以轻松地将数据流式传输到服务器.
我想做什么: 在nodeJS上运行一个app服务器(可能实现socketIO和binaryJS),捕获传入的RTMP流.就像是
//require
var rtmp = require('node-rtmp'),
var fs = require('fs');
//rtmp server address
var rtmpServer = 'rtmp://localhost';
//create a binary server listening that receives stream data
var …Run Code Online (Sandbox Code Playgroud) 我新写了一个简单的聊天应用程序,但我并不真正了解ICE候选人的背景.
当对等方创建连接时,它们会获得ICE候选者并且他们交换它们并最终将它们设置为对等连接.
所以我的问题是,ICE候选人来自哪里,他们如何使用,他们都真的使用过?
我注意到我的同事在他的机器上执行应用程序时得到的候选人较少,这可能是不同候选人数量的原因?
一旦被拒绝,我们如何使用getUserMedia()请求摄像头/麦克风访问?
我正在使用getUserMedia访问用户的摄像头并将数据传输到画布.这一切都很好.
在测试中,我打了一次否认.此时在Chrome和Firefox中,任何带有getUserMedia()的后续请求都默认为拒绝状态.
我们显然不希望通过在拒绝后的每个页面加载上请求相机/麦克风的权限来惹恼我们的用户.对地理位置api来说已经足够烦人了.
但是,必须有一种方法再次请求它.仅仅因为用户点击拒绝一次并不意味着他们想要一直拒绝网络摄像头访问.
我一直在阅读有关规范和谷歌搜索一段时间,但我没有找到任何明确的问题.
编辑:进一步研究,似乎在Chrome中点击Deny会将当前网站添加到阻止列表中.这可以通过chrome:// settings/content手动访问.滚动到媒体.管理例外,删除被阻止的网站.
链接到chrome:// settings/content不起作用(在我们想要添加有用链接以让人们重新启用权限的情况下).
用于处理getUserMedia周围权限的整个UX很糟糕.=(
webrtc ×10
javascript ×5
c++ ×2
html5 ×2
broadcast ×1
camera ×1
candidate ×1
channel ×1
getusermedia ×1
html5-video ×1
ice-protocol ×1
ios11 ×1
node.js ×1
red5 ×1
rtmp ×1
scalability ×1
tcp ×1
transport ×1
udp ×1
video ×1
websocket ×1