1、使用VPN网络经常打不开视频。
webrtc网络是边收集网络环境信息,边交换。先收集到的是内网信息,然后是公网信息。如果在还未收集到公网信息的情况下,只拉取到内网信息。则在深信服的VPN环境下,webrtc-streamer服务器无法发送数据包到本地。
从接口/api/getIceCandidate的返回值可以看出问题。当缺少公网网络信息的时候,视频无法打开
[
{
"candidate" : "candidate:365427782 1 udp 2122260223 192.168.25.113 7998 typ host generation 0 ufrag 6HsH network-id 1 network-cost 50",
"sdpMLineIndex" : 0,
"sdpMid" : "0"
},
{
"candidate" : "candidate:2282355315 1 udp 2122194687 10.10.125.113 18486 typ host generation 0 ufrag 6HsH network-id 2 network-cost 50",
"sdpMLineIndex" : 0,
"sdpMid" : "0"
},
{
"candidate" : "candidate:155319495 1 udp 1685987071 xxx.xxx.xxx.xxx 18486 typ srflx raddr 10.10.125.113 rport 18486 generation 0 ufrag 6HsH network-id 2 network-cost 50",
"sdpMLineIndex" : 0,
"sdpMid" : "0"
}
]
解决方法是:修改前端源码,延迟/api/getIceCandidate的调用。个人的环境延迟200毫秒即可
1.2 DNS
打不开视频还有一个原因,就是DNS服务器解析的STUN 服务器IP可能太远,不能及时收集到公网IP信息,导致视频打开不稳定。webrtc-streamer默认的stun服务器为:stun.l.google.com:19302。使用 ping stun.l.google.com 查看IP,测试了以下两个IP是比较稳定的。如果解析到其他IP请斟酌使用。
解决办法,修改DNS或者修改HOST
#108.177.125.127 stun.l.google.com
172.217.213.127 stun.l.google.com
2、服务器视频CPU拉满
webrtc-streamer实时转码非常消耗CPU资源,每一个客户端就要吃掉40%+的CPU。视频关掉的时候,一定要记得调用/api/hangup(disconnect)接口以关闭资源。不然会一直占用服务器资源,webrtc-streamer会一直转码和发送,占用网络和CPU
偶然看到网上说CPU占用过高可以使用 -o 参数,试了可用,一个视频要大概占4%-6%CPU,但是视频打开的速度会慢个2、3秒。同一个视频被打开多次也会增加CPU开销。
-o : use null codec (keep frame encoded) 字面意思是保持视频帧编码,也就是不解码的意思。难道是把解码的工作交给前端?但是我测试了一下,并没有明显的增加客户端CPU的使用率。
3、webrtc-streamer网络
打开一个视频,webrtc-streamer 会为每一个网卡(非loopback)绑定一个udp 和 tcp的端口,同时也会为连接到stun服务器的IP绑定一个端口
优先使用udp协议的端口,然后再使用tcp
host srflx prflx relay
host candidate:本机物理网卡或逻辑网卡地址和端口
srflx candidate:全称Sever Reflexive Candidate,端发送Binding请求到STUN/TURN Server经过NAT时,NAT上分配的地址和端口
prflx candidate:全称Peer Reflexive Candidate,端发送Binding请求到对等端经过NAT时,NAT上分配的地址和端口
relay candidate:全称Relayed Candidate,端发送Allocate请求到TURN Server,由TURN server用于中继的地址和端口
4、前端参数
/api/call?peerid=0.4629538284518011&url=%2Fstream%2Fdalajia102.flv&options=rtptransport%3Dtcp%26timeout%3D60
webrtc-streamer的demo在调用call方法的时候,会加上options这一个参数,而我们在自己的系统前端没有加,导致部分视频打不开,或者打开极慢。原因还不清楚
5、网络端口
webrtc使用网络打洞原理,会把请求的端口变成监听的端口。这是个随机端口,可以在webrtcstreamer里面配置开启的端口范围(-R Udp_port_min:Udp_port_min : Set the webrtc udp port range (default:0:65535) 我没有试过),如果服务器的端口不放开的话,会导致浏览器无法打开视频
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我想找到在某些文本中找到一些(让它是两个)句子的好方法。什么会更好-使用正则表达式或拆分方法?你的想法?应JeremyStein的要求-有一些例子示例:输入:ThefirstthingtodoistocreatetheCommentmodel.We’llcreatethisinthenormalway,butwithonesmalldifference.IfwewerejustcreatingcommentsforanArticlewe’dhaveanintegerfieldcalledarticle_idinthemodeltostoretheforeignkey,butinthis
是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
我正在使用ruby1.8.7。p=lambda{return10;}deflab(block)puts'before'putsblock.callputs'after'endlabp以上代码输出为before10after我将相同的代码重构到这里deflab(&block)puts'before'putsblock.callputs'after'endlab{return10;}现在我收到LocalJumpError:意外返回。对我来说,这两个代码都在做同样的事情。是的,在第一种情况下我传递了一个过程,在第二种情况下我传递了一个block。但是&block将该block转换为pro
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
(本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展 是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。 如:有三个人,每个人做的不同的事物,但是是需要协作的完成。 而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据
我在Ruby中有一个哈希:hash=Hash.new里面有一些键值对,比如说:hash[1]="One"hash[2]="Two"如果散列包含键2,那么我想将“Bananas”添加到它的值中。如果散列没有键2,我想创建一个新的键值对2=>"Bananas"。我知道我可以通过首先使用has_key?检查散列是否具有key2来做到这一点,然后采取相应的行动。但这需要一个if语句和不止一行。那么是否有一种简单、优雅的单行代码可以实现这一目标? 最佳答案 这个有效:hash[2]=(hash[2]||'')+'Bananas'如果您希望所有