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)

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

原文地址:https://www.cnblogs.com/easydss/p/15330544.html