随笔 - 936  文章 - 0  评论 - 3  阅读 - 30万

网络摄像头IPC网页无插件直播国标gb28181协议视频平台EasyGBS开启云端录像后断流如何解决?

TSINGSEE青犀视频研发团队研发的国标GB28181协议视频平台有三种录像方式,分别是云端录像、实时录像和设备录像,三种录像方式有不同的功能(云端录像存储及计划保存介绍)。

在EasyGBS运行的时候我们发现了一个问题,设备接入到EasyGBS上,刚开始能正常播放,随后开启云端录像,就出现流断流的现象,这其中我们并没有进行停止播放的操作。

进过抓包分析,排查出是程序向设备发送了停止推流的请求。

但是此时设备的状态确实在播放的状态,所以我们仍然需要继续排查。

在排查代码之后我们发现,在设备网络不好的时候设备会断流,然后超过指定的时间30s(EasyGBS平台默认值),就会主动去清除流媒体服务,但是redis中的流数据还在,而当设备在录像的时候,自动保活会去从redis中去保活流数据,所以就会出现设备状态显示是在播放的状态,但是流已经消失的情况。

为了解决这个断流问题,我们决定在设备进行播放保活的时候对流信息进行判断,添加一个最后的处理流时间,如果超过指定时间就自动重新拉流。代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if stream != nil {
        latestGetFrameTime := stream.LatestGetFrameTime
        if latestGetFrameTime != "" {
            lastStreamTime, err := time.ParseInLocation("2006-01-02 15:04:05", latestGetFrameTime, time.Local)
            if err != nil {
                log.Printf("stop stream [%s] lastStreamTime %s err [%s]", streamid, latestGetFrameTime, err.Error())
                StreamStop(streamid)
                stream = nil
            }
            d := time.Since(lastStreamTime)
            if int(d.Seconds()) >= 60 {
                log.Printf("stop stream [%s] lastStreamTime %s", streamid, latestGetFrameTime)
                StreamStop(streamid)
                stream = nil
            }
        }
    }

  

修改过后录像播放都正常了

直播间录像录制机制说明一文中,我们详细说明了EasyDSS视频平台录像机制,其实在EasyGBS内的机制也是一样的,如果大家对EasyGBS有兴趣或者有需求,欢迎联系我们。

posted on   EasyGBS  阅读(258)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示