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)
采用此种写法,对代码进行了优化。