zoukankan      html  css  js  c++  java
  • EasyDSS如何对正在直播通道的定时快照获取方式进行简化?

    TSINGSEE青犀视频开发的网页无插件视频直播点播平台EasyDSS为了便于大家的二次开发,提供了很多接口供大家调用,其中web界面快照的获取就是采用了快照接口的调用。

    EasyDSS快照是从数据库中取出需要进行定时快照的数据,然后查询对应的直播间是否正在直播,如果正在直播,则进行截图功能,以下为源代码:

    func InspectionSnap() {
       //获得待截图流ID
       var snaps []do.TSnap
       dao.GetDB().Table(consts.TableSnap).Find(&snaps)
       for _, snap := range snaps {
          if snap.LiveID != consts.EmptyString {
             if !snap.Actived ||
                snap.SnapReserve <= 0 ||
                (snap.BeginAt != nil && time.Now().Before(snap.BeginAt.ToTime())) ||
                (snap.EndAt != nil && time.Now().After(snap.EndAt.ToTime())) {
                return
             }
             for _, liveID := range strings.Split(snap.LiveID, consts.SplitComma) {
                //如果存在自动直播
                if mediaserver.HasLive(liveID) {
                   // log.Println(time.Now(), time.Now().Unix(), snap.SnapTime.ToTime(), snap.SnapTime.ToTime().Unix())
                   //判断是否达到截图时间
                   if snap.SnapTime == nil || snap.SnapTime != nil && (time.Now().Unix()-snap.SnapTime.ToTime().Unix()) >= int64((snap.SnapInterval-7)) {
                      dao.GetDB().Table(consts.TableSnap).Where(consts.SqlWhereID, snap.ID).Update("snap_time", etime.Now())
                      trans.SnapLive(liveID, mediaserver.GetLocalRtmpUrl(liveID), snap.ResolutionW, snap.ResolutionH, nil)
                   }
                }
             }
          }
    
       }
    }
    

    在审查代码时,发现每次都是从数据库中取出所有数据,然后再进行判断是否启用,这样取出的数据量非常大,而且取出很多无效数据,因此可以进行优化。

    func InspectionSnap() {
       //获得待截图流ID
       var snaps []do.TSnap
       dao.GetDB().Table(consts.TableSnap).Where("actived = ?", true).Find(&snaps)
       for _, snap := range snaps {
    
          if snap.LiveID != consts.EmptyString {
             if snap.SnapReserve <= 0 ||
                (snap.BeginAt != nil && time.Now().Before(snap.BeginAt.ToTime())) ||
                (snap.EndAt != nil && time.Now().After(snap.EndAt.ToTime())) {
                return
             }
             for _, liveID := range strings.Split(snap.LiveID, consts.SplitComma) {
                //如果正在直播
                if mediaserver.HasLive(liveID) {
                   // log.Println(time.Now(), time.Now().Unix(), snap.SnapTime.ToTime(), snap.SnapTime.ToTime().Unix())
                   //判断是否达到截图时间
                   if snap.SnapTime == nil ||
                      (snap.SnapTime != nil && (time.Now().Unix()-snap.SnapTime.ToTime().Unix()) >= int64((snap.SnapInterval-7))) {
                      dao.GetDB().Table(consts.TableSnap).Where(consts.SqlWhereID, snap.ID).Update("snap_time", etime.Now())
                      trans.SnapLive(liveID, mediaserver.GetLocalRtmpUrl(liveID), snap.ResolutionW, snap.ResolutionH, nil)
                   }
                }
             }
          }
    
       }
    }
    

    其中以下语句为取出已经在启用状态的截图。

    dao.GetDB().Table(consts.TableSnap).Where("actived = ?", true).Find(&snaps)
    

    采用此种写法,对代码进行了优化。

  • 相关阅读:
    Windows系统Nessus离线(Offline) 版的安装
    Openstack中keystone与外部LDAP Server的集成
    MySQL常用指令
    关于RequestParam在不同的Spring版本上,接口在controller重载时注解可能失效的踩坑记录
    利用反射注册SpringCache的RedisCacheManager缓存信息
    缩减项目代码中的大面积if策略
    Pentaho Report Designer 报表系统
    五种设计模式的分享
    反射的实践测试
    关于内外网分离情况下双网卡访问速度问题的解决
  • 原文地址:https://www.cnblogs.com/easydss/p/15330544.html
Copyright © 2011-2022 走看看