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

国标GB28181协议国标视频平台EasyGBS修改云端录像不起效是什么原因?

最近我们研发花了很大精力在国标平台EasyGBS上,由于EasyGBS近期更新版本的原因,很多功能都做了调整,因此我们也在不断的调试当中,确保功能的正常使用。

近期我们在做EasyGBS云端录像的时候就发现一个问题,即云端录像设置好天数之后,再次修改录像天数时,就不起作用了。然而理论上这个修改应该是随时生效的。

 

经过排查代码发现,在设置好录像天数之后,再次将录像天数设置成0,表面上停止了录像清理,实质是录像清理的定时器并没有删除。

原因是channel结构体中设置的停止通知通道,是私有变量,两次赋值之后再取值得到的并不准确,所以导致停止之后,实质上的定时器仍在执行。

func (channel *Channel) StopTicker() {
    if channel.quit != nil {
        channel.quit <- true
    }
}
func (channel *Channel) DoTicker() {
    if channel.quit == nil {
        channel.quit = make(chan bool)
    } else {
        return
    }
    channel.cleanRecordTime = time.Now()
    ticker := time.NewTicker(10 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            thisTime := time.Now()
            if channel.GetRecordReserveDuration() > 0 && thisTime.After(channel.cleanRecordTime.Add(60*time.Second)) {
                channel.CleanRecord()
            }
        case <-channel.quit:
            return
        }
    }
}

所以修改通知停止的录像为一个map,在开始录像的时候将通道的id作为key存入map中,停止录像的时候删除key。每次进行录像清理的时候判断map中的key是否存在。

var atsMap sync.Map

func (channel *Channel) DoTicker() {
    key := fmt.Sprintf("%s_%s", channel.DeviceID, channel.ID)
    if _, ok := atsMap.Load(key); !ok {
        atsMap.Store(key, true)
    } else {
        return
    }
    channel.cleanRecordTime = time.Now()
    ticker := time.NewTicker(10 * time.Second)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            if _, ok := atsMap.Load(key); !ok {
                return
            }
            thisTime := time.Now()
            //获取录像小时
            if channel.GetRecordReserveDuration() > 0 && thisTime.After(channel.cleanRecordTime.Add(60*time.Second)) {
                channel.CleanRecord()
            }

再次修改云端录像天数一切正常:

本文就和大家分享到这里,如果大家对EasyGBS感兴趣的话,欢迎联系我们。EasyGBS平台能够给大家提供测试版本,让大家直观面对EasyGBS功能,欢迎试用。

posted on   EasyGBS  阅读(106)  评论(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

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