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)
    

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

  • 相关阅读:
    第二代:晶体管计算机
    第一代计算机
    Android应用在不同版本间兼容性处理
    eventBus
    realm
    ijkplayer详解AAA
    USB 3.0规范中译本 第3章 USB 3.0体系结构概览
    ES6 学习笔记
    07_通过上下文获取常见目录
    06_登陆案例保存信息完成
  • 原文地址:https://www.cnblogs.com/easydss/p/15330544.html
Copyright © 2011-2022 走看看