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) 我没有试过),如果服务器的端口不放开的话,会导致浏览器无法打开视频