浏览器 H5 就像一个硬币有两面,有好处也有劣势,好处是开发成本低,容易传播,劣势是只能拉流,不能推流,不能做到多个用户连麦直播。另外,在浏览器 H5 上延迟也是比较大。如果使用 RTMP 或者 HTTP-FLV,延迟会在 1 秒到 3 秒之间,如果用 HLS 延迟会大于 8 秒甚至 10 秒,这么大的延迟就根本就不允许实现连麦直播。

使用这三种协议都是通过浏览器 H5 中的播放器来播放的。在多主播连麦互动的场景中,一个播放器里面只能播一路视频流,三个主播就得三个播放器,因此看不到多个主播同框连麦互动的情形。如果要看到多个主播同框互动的画面,就必须把多路流混合成一路流,在单个播放器里面播放。
另外,浏览器 H5 的源代码是开放的。如果在浏览器上把音视频终端引擎实现了,相当于对外公开了所有核心的源代码。因此,还没有见过哪个厂商在浏览器 H5 上完整地把音视频引擎真正做出来。即使你愿意做出来,浏览器也不会允许你这样做,开发者和操作系统之间隔着浏览器,如果浏览器不把操作系统的核心能力开放给开发者,开发者就不能自主采集和渲染,不能掌控网络输入输出,类似流控码控等功能无法实现。即时通讯聊天软件app开发可以加蔚可云咨询
在浏览器 H5 中也可以通过 websocket 来传输,用 jsmpeg 来播放,视频编解码的格式用 mpeg1。
mpeg1 是一个比较老的媒体格式,所有浏览器都支持。在浏览器中使用 jsmpeg 播放器播放 mpeg1,所有浏览器也可以支持。这么做可以获得比较低的延迟,但是还是无法推流,没办法实现连麦直播。

大家可能会觉得很遗憾,浏览器 H5 虽然很容易传播,开发简单但是体验欠佳,不能连麦直播。那么在浏览器上能不能推流,能不能实现连麦直播呢?答案是可以的,那就要用到 WebRTC。
这里说的 WebRTC 是指已经被内嵌到浏览器里面,被浏览器支持的 WebRTC,而不是 WebRTC 的源代码。部分主流浏览器内嵌了 WebRTC,对开发者开放了浏览器的实时音视频能力。
上图是 WebRTC 的结构图。我们可以看到 WebRTC 包括了音频引擎,视频引擎、传输引擎等,最底层的虚线框表示可以重载,也就是说浏览器把最底层的音视频渲染和网络传输的底层能力开放给开发者,开发者可以根据自己的需求选择是否进行重载。音频引擎中,包括了两个编解码器:iSAC 和 iLBC,前者针对宽带和超宽带的音频编解码,后者针对窄带音频编解码。
音频引擎还包括了音频抖动缓冲,回声消除和噪音抑制模块等。抖动缓冲中的 NetEQ 算法可以说是 WebRTC 里面的精华之一。
视频引擎中,包括了 VP8 和 VP9 的视频编解码器,甚至是即将到来的 AV1。视频引擎还包括视频抖动缓冲和图像质量增强等模块。传输引擎,WebRTC 使用的是 SRTP(Secured Realtime Transport Protocol)安全实时传输协议。
最后,WebRTC 采取 P2P 的通信方式,没有媒体服务器等后端的实现。以上是 WebRTC 的简单介绍。
浏览器 WebRTC 一般的优势和劣势这里就不再重复,请大家自行百度,这里只说重点。浏览器 WebRTC 的好处就是实现了相对完整的音视频终端引擎,允许在浏览器上推流,可以实现连麦直播。
然而,浏览器 WebRTC 也有不足:
没有开放前处理接口,美颜和挂件这些模块没办法接入第三方的或者自研方案;
媒体服务器后端没有实现,开发者要实现媒体服务器,然后通过开源 WebRTC 网关(比如说 janus)接入;
编解码器、抖动缓冲和语音前处理 3A 等能力只能依靠 WebRTC,不能自行定制化;
部分主流浏览器是不支持 WebRTC 的,特别是苹果的浏览器。虽然说去年苹果宣布支持 WebRTC, 但是目前 iOS Safari 最新版本对 WebRTC 的支持并不好,iOS Safari 的主流版本并不支持 WebRTC,在 iOS 上面微信浏览器也是不支持 WebRTC 的。
由于 WebRTC 不提供媒体服务器的实现,因此需要把浏览器 WebRTC 接入到媒体服务器后端,这个可以是自研的,也可以是第三方的服务。浏览器 WebRTC 和媒体服务器后端之间的协议和媒体格式是不一样的,因此要做协议和格式的转换。WebRTC 用的基于 UDP 的 SRTP,需要把它转换成媒体服务器的基于 UDP 的私有协议。另外,媒体格式也需要转换,因为 WebRTC 中语音视频格式默认用的是 VP8 或者 VP9。同时实时传输网络中有关信令调度也需要做一些调整。浏览器 WebRTC 和媒体服务器后端之间的接入层也可以采用开源的 WebRTC Gateway(比如说 janus)来实现。
浏览器是类似操作系统的一种超级应用,它坐拥重要的流量入口,然而它也是开发者和操作系统之间的“中间商”。开发者通过 WebRTC 获得浏览器开放的实时音视频能力,然而也必须要承受 WebRTC 带来的痛苦。
我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我需要在RubyonRails中实现无向图G=(V,E)并考虑构建一个Vertex和一个Edge模型,其中Vertex有_多条边。由于边恰好连接两个顶点,您将如何在Rails中执行此操作?您是否知道任何有助于实现此类图表的gem或库(对重新发明轮子不感兴趣;-))? 最佳答案 不知道有任何现有库在ActiveRecord之上提供图形逻辑。您可能必须实现自己的Vertex、EdgeActiveRecord支持的模型(请参阅Rails安装的rails/activerecord中的vertex.rb和edge.rb/test/fixtur
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.