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()
}
再次测试,当录像计划停止时,再次点击观看,设备也不会继续录像,问题解决。