国标GB28181协议视频人脸识别/车牌识别平台EasyCVR录像计划关闭无效问题排查

EasyCVR根据不同客户端进行全平台直播,可以分发出RTMP和HLS流,能够完美覆盖目前市面上所有需求平台,同时,EasyCVR在直播时,还提供了多种配套功能进行辅助:直播鉴权功能、按需直播功能。此外,EasyCVR内还支持通过录像计划实现视频录像。

我们日常测试EasyCVR时,对某一通道开启云端录像的录像计划进行录制,一段时间后关闭录像计划,此时录像是能够正常停止的,但是当再次点击播放该通道的直播流数据时,会出现重新开始录制的情况。

此时设备云端录像列表与录像计划设置如下所示:

当有用户在播放时,设备录像列表截图

可以看出来,假如设备没有开启云端录像的录像计划,当用户在播放视频流时,设备依然会录像。

通过排查代直播流程代码发现,当设备直播时回去且设备录像保留天数大于0时,就会开启云端录像推送数据。

mediaSession.Snaping = true
mediaSession.Pusher = rtmp.NewStreamPusher(rtmpID, rtmpURL)
err = mediaSession.Pusher.Open()
if mediaSession.Record != 0 {
       mediaSession.RecordPusher = rtmp.NewStreamPusher(recordID, recordURL)
       if err := mediaSession.RecordPusher.Open(); err != nil {
              sms_log.Log.Fatalf("[%s]record pusher open failed:[%s]", rtmpID, err.Error())
       }
}

因为加了录像计划的开关,所以这里的代码需要做如下调整,启动一个监听录像计划的后台进程,当有满足录像计划的设备时,自动开启录像

for _, l := range uax.ChannelDispatcher.GetListeners(fmt.Sprintf("cloud_record_%s_%s", session.GetDeviceID(), session.GetChannelID())) {
       uax.ChannelDispatcher.RemoveListener(l)
}
cloudRecordListener := events.NewListener(fmt.Sprintf("cloud_record_%s_%s", session.GetDeviceID(), session.GetChannelID()), func(arg ...interface{}) bool {
       if arg[0].(uint) > 0 {
              if session.RecordPusher == nil {
                     _recordID := fmt.Sprintf("%s_%s", session.GetDeviceID(), session.GetChannelID())
                     _recordURL := fmt.Sprintf("rtmp://127.0.0.1:%d/record/%s", dss.GetRTMPPort(), _recordID)
                     session.RecordPusher = rtmp.NewStreamPusher(_recordID, _recordURL)
                     session.RecordPusher.Open()
              }

再次测试,当录像计划停止时,再次点击观看,设备也不会继续录像,问题解决。

原文地址:https://www.cnblogs.com/TSINGSEE/p/14217788.html