流媒体服务器二次开发对接微信小程序起播HLS流不成功的原因分析
这两天有个开发者在使用我们的流媒体服务器做微信小程序二次开发的时候遇到一些问题,现在我来给大家分享这个过程,如果以后还有开发者遇到类似问题,可参考本篇进行排查。
这位开发者的现场有200路摄像机需要接入流媒体服务器,前期测试的时候接入的是100路,流媒体服务器并没有表现出压力,但是后期持续增加到200路的时候,服务器性能开始跟不上了,因为小程序这边需要的流是HLS流,所以在服务器上用内存虚拟出来1G的磁盘用作缓存,这样大大提高了磁盘读写效率,另外考虑到并发量和出口带宽的问题,采用了按需直播的方式。
为了协助这个开发者测试,对小程序并不了解的我非常敬业的用WINFORM写了一个Demo,根据我们流媒体服务器的接口定义,我简单梳理了一下:先调用登录接口->然后调获取通道直播链接->保活通道直播链接,搞定。
下面看DEMO:
但是在我连续跑了几次之后,发现有点问题,有时候不能正常起播,有时候又可以,搞的非常郁闷,现在深扒一下整个过程:
HLS 的基本原理就是当采集推流端将视频流推送到流媒体服务器时,服务器将收到的流信息每缓存一段时间就封包成一个新的 ts 文件,切片文件(三片),同时服务器会建立一个 m3u8 的索引文件来维护最新几个 ts 片段的索引。当播放端获取直播时,它是从 m3u8 索引文件获取最新的 ts 视频文件片段来播放,从而保证用户在任何时候连接进来时都会看到较新的内容,实现近似直播的体验。
原来在按需直播的模式下,EasyNVR是在客户端请求时再去摄像机拉流过来,这样再加上上面的过程,因为接口返回比视频流快的多,所以再接口返回直播流地址的时候,我们直接起播,这时候视频流还未生成切片文件,所以无法播。知道这个原理后,我们修改了代码,在获取直播链接后,等个2-3秒,然后起播,成功搞定,也再次出现之前的问题了。