H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
EasyPlayer.js无插件H5播放器属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放,无须安装任何插件,起播快、延迟低、兼容性强,使用非常便捷。
EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式,也能支持WebSocket-FLV、HTTP-FLV、HLS(m3u8)、WebRTC、ws-fmp4、http-fmp4等格式的视频流,并具备直播、点播、录像、快照截图、MP4播放、多屏播放、倍数播放、全屏播放等功能特性。
1006是websocket的一个异常码,表示连接异常断开。
1006:CLOSE_ABNORMAL,用于期望收到状态码时连接非正常关闭。
WebSocket关闭状态码1006是由于服务器在接收到客户端的连接请求后,在建立连接前发生了错误导致连接失败。
可能的原因
1、在客户端和WebSocket服务器之间的全双工连接中,有时候连接上可能没有数据流。在这个时候,网络中介可能中止连接。
就是可能会在一段时间内没有数据流,导致网络中介认为连接已经断开了。
2、也有可能是播放器端进程卡住了,导致接受推流的速度变慢,导致流媒体推流端推流到播放器变慢,甚至直接没法接收到流媒体传输过来的数据,导致网络中介认为没有流数据了,为连接已经断开了,也有可能是服务器端检测到堆积量过大,从而断开了ws连接,从而导致浏览器抛出了1006错误。
3、有可能是本地的网络带宽上限要低于流媒体服务器端推流的码率,比如流媒体服务器端推流的码率是2M,而本地的网络带宽只有1M,这样就会有1M的数据堆积没法到达播放器端,导致服务器端堆积过多就会断开连接,然后播放器抛出了1006错误。
通讯层(浏览器底层)断连了,但是应用层还是连接着,这个时候浏览器就会抛出1006错误。
4、大多情况都是因为websocket连接在nginx配置的proxy_read_timeout内没有收到数据,nginx主动发起的连接断开(不是客户端主动断开,也不是服务端主动断开的)
client->proxy->ws-server如果proxy和ws-server之间通信有问题client就会收到1006错误码。
5、网络连接问题:网络中断、防火墙设置等因素可能导致WebSocket连接异常关闭。
在播放倍率流的时候,如果服务器端是高倍率推流,比如8倍,这个时候如果电脑的性能跟不上,就会导致解封装和解码跟不上,因为js是单线程的,会导致解码和解封装的速度跟不上,导致堆积量过大,从而堵塞了接收流数据,从而触发了服务器端数据堆积过大,从而从物理层断开ws连接,从而导致浏览器抛出了1006错误。
这种情况下可以考虑检查服务器端的程序和硬件是否正常工作,查看服务器端的日志和监控数据来找出问题所在。
解决方案
需要在nginx加入一段proxy的timeout超时设置,加了500s。
播放器支持内部检测到1006错误,会内部自动重连。
EasyPlayer.js播放器项目系列已经具备Windows、Android、iOS三个平台的稳定运行版本,EasyPlayer.js无插件H5播放器还支持Linux平台,在播放器领域是多平台的最佳选择,并且EasyPlayer.js播放器系列项目底层采用了高性能的EasyRTSPClient组件,其低延时控制在行业处于领先位置。