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)
    

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

  • 相关阅读:
    mixer: 一个用go实现的mysql proxy
    【Unity Shaders】Using Textures for Effects——打包和混合textures
    sharding jdbc:分库、分表;读写分离;
    springboot(四):thymeleaf使用详解
    spring boot(三):spring data jpa的使用
    深入理解Java虚拟机JVM
    Java入门(4)内部类
    .NET 定时器类及使用方法
    JDK源码
    Java入门(3)面向对象三大特性:封装、继承、多态
  • 原文地址:https://www.cnblogs.com/easydss/p/15330544.html
Copyright © 2011-2022 走看看