天天看点

GB28181平台实现定时录像

  按照GB28181协议,平台与客户端可以直接查询每个接入设备的录像,并可以回放和下载每个设备的录像。

  如果接入的GB28181设备没有配置存储,那么可以在gb28181平台服务端(所谓的云端)进行定时计划录像。

 视跃的GB28181平台realgbs就具备从服务端配置每个设备的录像计划,进行定时录像的功能,首先在录像管理里配置定时任务,如下图:

GB28181平台实现定时录像

点击保存后,我们可以在录像任务里将制定的设备ID绑定该录像任务,然后每周每天,平台会按照设置的录像计划的时间段进行定时录像。录像可以在查询录像里回放,如下图:

GB28181平台实现定时录像

这样,不需要给每个接入的GB28181设备配置存储卡了,是不是经济有方便。我们要说下定时录像的主要实现了。定时录像是需要使用定时器管理的,为了极限的提高平台的性能,我们实现了一个可变时等待的定时器,不需要一直定时扫描,如下代码:

bool CRecordService::onTimer(const comn::TimerID& id, uint32_t& interval)
{
	if (id == "recordtimer")
	{
		checkPlan();
		return true;
	}
	else if (id.find("start_") != id.npos)
	{
		vector<std::string> strArray;
		comn::StringUtil::split(id, '_', strArray);
		if (strArray.size() == 2)
		{
			startRecord(strArray[1], m_mapiStopTime.get(strArray[0]), gbt::kTimeRecord, "user");
			m_mapiStopTime.remove(strArray[0]);
		}
		return false;
	}
	else
	{
		LiveStreamRecorderPtr recorder = m_recorderMap.find(id.c_str());
		if (!recorder)
		{
			return false;
		}

		time_t tmNow = time(NULL);
		time_t stopTime = recorder->makeStopTime();
		if (stopTime <= 0 || stopTime <= tmNow)
		{
			stopRecord(id.c_str());
			return false;
		}
		else
		{
			interval = (int)(tmNow - stopTime);
		}
	}

    return true;
}
           

如上图可知,我们每次定时器挂起休眠的时间是根据录像任务和当前时间的差值是可以变化的,产生的差值就是变量interval ,这样不至于刷瓜的高频率的定时去读数据库,查询录像计划了。

这样就实现了高性能的带定时计划录像的GB28181平台,演示地址:https://gbs.realgbs.com:8280

更多信息

e-mail: [email protected]

tel: 13971177602

web:www.founu.com

继续阅读