随笔 - 1499  文章 - 1  评论 - 7  阅读 - 58万

RTSP协议视频智能流媒体服务平台EasyNVR录像计划功能实现过程

之前的博文中我们和大家讲过EasyNVR的录像计划的实现方式,大家可以简单了解一下操作方式:EasyNVR边缘计算网关录像计划功能操作介绍。关于EasyNVR录像计划的实现,TSINGSEE青犀视频的研发人员也耗费了不少心思,下面我们就讲一下是是如何实现的。

EasyNVR录像计划,其实就是在EasyNVR先为通道配置好录像计划,然后该通道就会以录像计划中的计划设置来录像。例如:通道1只开启每天的下午1点到2点录像,那么通道1就只会在每天的下午1点到2点有录像,不会像现在一旦开启录像,就是直接录像一整天。

这样就可以达到节省磁盘空间的效果,录像也更灵活。下面是实现代码:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
func checkRecordPlan() gin.HandlerFunc {
   return func(c *gin.Context) {
      c.Request.ParseForm()
      log.Printf("----------form:%s", c.Request.Form)
      app := c.Request.Form.Get("app")
      call := c.Request.Form.Get("call")
      name := c.Request.Form.Get("name")
      channelId, _ := strconv.Atoi(name[7:])
      if app == "record" && (call == "update_publish" || call == "publish") {
         var camera models.Camera
         models.DB.Model(models.Camera{}).Where("id = ?", channelId).First(&camera)
         recordDay, _ := strconv.Atoi(camera.Reserve3)
         if recordDay != 0 {
            log.Printf("----------RecordAllPlan:%s", camera.RecordAllPlan)
            if camera.RecordPlanEnable == 0 && camera.RecordAllPlan != "" {
               if !checkTimeByRecordPlan(camera.RecordAllPlan) {
                  channelInfo := channels.GetChannel(uint(channelId))
                  channelInfo.StopRecordPusher()
                  c.AbortWithStatus(http.StatusBadRequest)
                  return
               }
            }
            //{"Monday":"","Tuesday":"15:50:00-16:00:00","Wednesday":"","Thursday":"","Friday":"","Saturday":"","Sunday":""}
            if camera.RecordPlanEnable == 1 && camera.RecordPlan != "" {
               if !checkTimeByRecordPlan(camera.RecordPlan) {
                  channelInfo := channels.GetChannel(uint(channelId))
                  channelInfo.StopRecordPusher()
                  c.AbortWithStatus(http.StatusBadRequest)
                  return
               }
            }
         }
      }
      c.Next()
   }
}
  
func CheckTimeUnix(timeArr []string) bool {
   if timeArr[0] == "" {
      return false
   }
   stampStart, _ := time.ParseInLocation("2006-01-02 15:04:05", time.Now().Format("2006-01-02")+" "+timeArr[0], time.Local)
   stampEnd, _ := time.ParseInLocation("2006-01-02 15:04:05", time.Now().Format("2006-01-02")+" "+timeArr[1], time.Local)
   stampNow := time.Now().Unix()
   if stampNow >= stampStart.Unix() && stampNow <= stampEnd.Unix() {
      return true
   }
   return false
}

  

其实就是靠一个字段来判断何时可以录像。

举个例子:

{“Monday”:"",“Tuesday”:“15:00:00-16:00:00”,“Wednesday”:"",“Thursday”:"",“Friday”:"",“Saturday”:"",“Sunday”:""}

比如上面的这一个字符串,意思就是只会在星期2的下午3点到下午4点录像,其他时间段不录像。

如果大家还想了解EasyNVR更多相关内容,可以自行下载测试,EasyNVR测试版本均提供API接口可进行二次开发,与正式版本无异,如若还有视频相关解决方案上的疑问,欢迎联系我们。

 
posted on   EasyNVR  阅读(240)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
< 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

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