//
|
// Created by ps on 18-9-26.
|
//
|
|
#include "RtspAnalysManager.h"
|
#include <basic/pipe_element/ffmpeg/basic_struct_for_video_image.h>
|
|
|
using std::string;
|
|
RtspAnalysManager::RtspAnalysManager(LDBTool *_dbTool) : m_lDBTool(nullptr), m_maxCount(50), m_currentCount(0) {
|
m_lDBTool=new LDBTool;
|
init();
|
|
}
|
|
|
|
static std::string rtspAddrBuild(std::string ip, const int port, std::string username,
|
std::string passwd, std::string brand) {
|
std::string rtsp_url;
|
if (brand == "haikang") {
|
rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
|
"/h264/ch1/main/av_stream";
|
} else if (brand == "dahua") {
|
//rtsp://username:password@ip:port/cam/realmonitor?channel=1&subtype=0
|
rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
|
"/cam/realmonitor?channel=1&subtype=0";
|
//TODO
|
} else if (brand == "yushi") {
|
rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) +
|
"/video1";
|
} else {
|
//TODO
|
}
|
|
return rtsp_url;
|
}
|
|
void RtspAnalysManager::init() {
|
|
auto lst = m_lDBTool->searchCamDevTableAll();
|
Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
|
|
//设置视频的最长和最短时间间隔
|
appPref.setIntData("n_cut_max_duration", lst_dev.n_cut_max_duration);
|
appPref.setIntData("n_cut_min_duration", lst_dev.n_cut_min_duration);
|
if (lst.size() > 0) {
|
|
for (auto item : lst)
|
{
|
std::string t_camIdex = item.str_cam_dev_id.toStdString();
|
std::string rtsp_url = rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(),
|
item.str_password.toStdString(), item.str_brand.toStdString());
|
INFO("cam add is " << item.str_addr.toStdString());
|
|
addCamera(t_camIdex, rtsp_url);
|
|
}
|
} else {
|
ERR("searchCamDevTableAll size is 0");
|
}
|
|
}
|
|
RtspAnalysManager::~RtspAnalysManager() {
|
for (auto controller: m_controllers) {
|
delete controller.second;
|
}
|
m_controllers.clear();
|
}
|
|
int RtspAnalysManager::addCamera(const std::string &index, const std::string& rtsp) {
|
auto lst = m_lDBTool->searchCamDevTableAll();
|
Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
|
|
if (m_controllers.find(index) == m_controllers.end()) {
|
if (m_currentCount >= m_maxCount) {
|
ERR("addCamera faild, camera's num is full!")
|
return -1;
|
}
|
DBG("RTSP: "<<rtsp<<" INDEX:"<<index);
|
m_imgRedisControllers[index] = new RtspImageRedisElement(index);
|
m_imgRedisControllers[index]->start();
|
|
m_controllers[index] = new RtspCaptureElement(rtsp,index, 25,3000,0,this);
|
m_controllers[index]->start();
|
m_controllers[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration,lst_dev.n_cut_max_duration);
|
m_currentCount++;
|
return 0;
|
|
} else {
|
removeCamera(index);
|
DBG("removeCamera " << index)
|
return addCamera(rtsp, index);
|
}
|
}
|
|
int RtspAnalysManager::removeCamera(const std::string &index) {
|
if (m_controllers.find(index) == m_controllers.end())return -1;
|
auto controller = m_controllers[index];
|
controller->stop();
|
controller->wait();
|
delete controller;
|
m_controllers.erase(index);
|
m_currentCount--;
|
|
auto imgRedis = m_imgRedisControllers[index];
|
imgRedis->stop();
|
imgRedis->wait();
|
delete imgRedis;
|
m_imgRedisControllers.erase(index);
|
return 0;
|
}
|
|
int RtspAnalysManager::removeAll() {
|
for (auto controller: m_controllers) {
|
controller.second->stop();
|
}
|
for (auto controller: m_controllers) {
|
controller.second->wait();
|
delete controller.second;
|
}
|
m_controllers.clear();
|
|
|
for (auto controller: m_imgRedisControllers) {
|
controller.second->stop();
|
}
|
for (auto controller: m_imgRedisControllers) {
|
controller.second->wait();
|
delete controller.second;
|
}
|
m_controllers.clear();
|
|
|
m_currentCount = 0;
|
return 0;
|
}
|
|
int RtspAnalysManager::getMaxCamCount() {
|
return m_maxCount;
|
}
|
|
int RtspAnalysManager::getCurrentCamCount() {
|
return m_currentCount;
|
}
|
::std::string RtspAnalysManager::recordVideo(const ::std::string& name, const ::Ice::Current&)
|
{
|
INFO("Record Video For: "<<name);
|
ImageName_s_t nameSt=ImageName_s_t::fromString(name);
|
if(nameSt.Valid())
|
{
|
auto pCaptureElem = m_controllers.find(nameSt.m_camId);
|
if(pCaptureElem!= m_controllers.end())
|
{
|
pCaptureElem->second->SaveVideo(name);
|
} else{
|
ERR("Can not Find CamId "<<nameSt.m_camId);
|
}
|
}
|
else{
|
ERR("Record Video Failed:Name Not Valid Name: "<<name);
|
}
|
return name;
|
}
|
|
|
bool RtspAnalysManager::SaveImageToRedis(const std::string& camId,const std::string& imageName,const cv::Mat& img)
|
{
|
auto item = m_imgRedisControllers.find(camId);
|
if(item!=m_imgRedisControllers.end())
|
{
|
item->second->SaveImage(imageName,img);
|
}
|
return true;
|
}
|