// // Created by ps on 18-9-26. // #include "RtspAnalysElement.h" #include using std::string; //RtspAnalysElement::RtspAnalysElement() {} std::string RtspAnalysElement::resetFdfs(std::string ip, unsigned int port, std::string content) { std::thread reset([&]() { fdfsClient.rwLock.rdlock(); if (fdfsClient.fastFds != nullptr) { delete fdfsClient.fastFds; } fdfsClient.fastFds = new FastFds("fastDfsClient.conf"); fdfsClient.rwLock.unlock(); }); reset.detach(); return ""; } RtspAnalysElement::RtspAnalysElement(LDBTool *_dbTool) : m_lDBTool(_dbTool), maxCount(50), currentCount(0) { init(); resetFdfs(); { // std::thread httpServer([&]() { // //#todo port // HttpSrvRetRecieve httpSrvRetRecieve("0.0.0.0", 12306, 1); // httpSrvRetRecieve.setInfo("^/resetFdfs$", "POST", std::bind(&RtspAnalysElement::resetFdfs, this, // std::placeholders::_1, // std::placeholders::_2, // std::placeholders::_3)); // httpSrvRetRecieve.start(); // httpSrvRetRecieve.waitForShutDown(); // }); // httpServer.detach(); } } #define SETSCORE(VEC, POS, IDENT) appPref.setFloatData(IDENT, POS >= VEC.size() ? 80 : VEC[POS]); //#define GETSCORE(IDENT) appPref.getFloatData(IDENT) == -1 ? 0.1 : appPref.getFloatData(IDENT); 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 RtspAnalysElement::init() { Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo(); #ifndef GB28181 auto lst = m_lDBTool->searchCamDevTableAll(); 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) { Json::Value json; int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep"); int CamCount = appPref.getIntData("CamStep"); auto itor = lst.begin(); if (startCamNO >= lst.size()) { ERR("startCamNO > lst.size()"); return; } for (int i = 0; i < startCamNO; i++) { itor++; } for (int i = 0; i < CamCount; i++) { if (itor == lst.end()) { ERR("itor == lst.end()"); return; } std::string t_camIdex = itor->str_cam_dev_id.toStdString(); std::string rtsp_url = rtspAddrBuild(itor->str_ip.toStdString(), 554, itor->str_username.toStdString(), itor->str_password.toStdString(), itor->str_brand.toStdString()); SdkRuleMap ruleMap = m_lDBTool->searchSdkRuleByCamId(itor->str_cam_dev_id); for (auto &rule:ruleMap) { rule.second.strAddr = itor->str_addr; rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(itor->str_cam_dev_id, rule.first); if (rule.second.nSdkType == PerStaticSdk) { float temp = 1 - (float) (rule.second.nThreshold) / 100; rule.second.fSensitivity = (75 + 25 * temp) / 100; } else if (rule.second.nSdkType != FaceSdk) { float temp = 1 - (float) (rule.second.nThreshold) / 100; rule.second.fSensitivity = (5 + 90 * temp) / 100; } // if (rule.second.nThreshold < 5 ) // { // rule.second.fSensitivity=0.95; // } // else if(rule.second.nThreshold > 95) // { // rule.second.fSensitivity=0.05; // } // else // { // rule.second.fSensitivity = 1-(float) (rule.second.nThreshold) / 100; // } DBG("fSensitivity" << rule.second.fSensitivity); } appPref.setStringData(t_camIdex + "rtsp", rtsp_url); // appPref.setStringData(t_camIdex+"addr", item.str_addr.toStdString()); json["rtsp"] = rtsp_url; // json["addr"] = item.str_addr.toStdString(); INFO("cam add is " << itor->str_addr.toStdString()); addCamera(t_camIdex, ruleMap); itor++; } // 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()); // SdkRuleMap ruleMap = m_lDBTool->searchSdkRuleByCamId(item.str_cam_dev_id); // for (auto &rule:ruleMap) { // // rule.second.strAddr = item.str_addr; // rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(item.str_cam_dev_id, rule.first); // // if(rule.second.nSdkType == PerStaticSdk) // { // float temp=1-(float)(rule.second.nThreshold)/100; // rule.second.fSensitivity=(75+25*temp)/100; // // } // else if(rule.second.nSdkType != FaceSdk) // { // float temp=1-(float)(rule.second.nThreshold)/100; // rule.second.fSensitivity=(5+90*temp)/100; // } //// if (rule.second.nThreshold < 5 ) //// { //// rule.second.fSensitivity=0.95; //// } //// else if(rule.second.nThreshold > 95) //// { //// rule.second.fSensitivity=0.05; //// } //// else //// { //// rule.second.fSensitivity = 1-(float) (rule.second.nThreshold) / 100; //// } // // DBG("fSensitivity" << rule.second.fSensitivity); // } // appPref.setStringData(t_camIdex + "rtsp", rtsp_url); // // appPref.setStringData(t_camIdex+"addr", item.str_addr.toStdString()); // json["rtsp"] = rtsp_url; // // json["addr"] = item.str_addr.toStdString(); // // INFO("cam add is " << item.str_addr.toStdString()); // // addCamera(t_camIdex, ruleMap); // } } else { ERR("searchCamDevTableAll size is 0"); } #else auto lst = m_lDBTool->searchCamDevTableByType(1); 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) { // Json::Value json; for (auto &item : lst) { std::string t_camIdex = item.str_cam_dev_id.toStdString(); std::string rtsp_url = "GB28181"; // rtspAddrBuild(item.str_ip.toStdString(), 554, item.str_username.toStdString(), // item.str_password.toStdString(), item.str_brand.toStdString()); SdkRuleMap ruleMap = m_lDBTool->searchSdkRuleByCamId(item.str_cam_dev_id); for (auto &rule:ruleMap) { rule.second.strAddr = item.str_addr; rule.second.weekRuleVec = m_lDBTool->searchCameraWeekRuleByCamId(item.str_cam_dev_id, rule.first); if (rule.second.nSdkType == PerStaticSdk) { float temp = 1 - (float) (rule.second.nThreshold) / 100; rule.second.fSensitivity = (75 + 25 * temp) / 100; } else if (rule.second.nSdkType != FaceSdk) { float temp = 1 - (float) (rule.second.nThreshold) / 100; rule.second.fSensitivity = (5 + 90 * temp) / 100; } DBG("fSensitivity" << rule.second.fSensitivity); } appPref.setStringData(t_camIdex + "rtsp", rtsp_url); // appPref.setStringData(t_camIdex+"addr", item.str_addr.toStdString()); // json["rtsp"] = rtsp_url; // json["addr"] = item.str_addr.toStdString(); INFO("cam add is " << item.str_addr.toStdString()); addCamera(t_camIdex, ruleMap); } } else { ERR("searchCamDevTableAll size is 0"); } #endif } RtspAnalysElement::~RtspAnalysElement() { for (auto controller: controllers) { delete controller.second; } controllers.clear(); } int RtspAnalysElement::addCamera(const std::string &index, const std::map &sdkRuleMap) { if (controllers.find(index) == controllers.end()) { if (currentCount >= maxCount) { ERR("addCamera faild, camera's num is full!") return -1; } controllers[index] = new AppPipeController(index, sdkRuleMap, true); controllers[index]->setfdfsClient(&fdfsClient); controllers[index]->start(); currentCount++; return 0; } else { removeCamera(index); DBG("removeCamera " << index) return addCamera(index, sdkRuleMap); } } int RtspAnalysElement::removeCamera(const std::string &index) { if (controllers.find(index) == controllers.end())return -1; auto controller = controllers[index]; controller->stop(); controller->wait(); delete controller; controllers.erase(index); currentCount--; return 0; } int RtspAnalysElement::removeAll() { for (auto controller: controllers) { controller.second->stop(); } for (auto controller: controllers) { controller.second->wait(); delete controller.second; } controllers.clear(); currentCount = 0; return 0; } int RtspAnalysElement::getMaxCamCount() { return maxCount; } int RtspAnalysElement::getCurrentCamCount() { return currentCount; } std::string RtspAnalysElement::getRtmp(std::string &index) { if (controllers.find(index) == controllers.end())return ""; auto controller = controllers[index]; return controller->getRtmp(); } std::vector RtspAnalysElement::chnString2Vec(std::string str_list) { std::vector result; char *property_list = const_cast(str_list.c_str()); const char *c_Analyse = ","; char *t_property; char *t_save = NULL; t_property = strtok_r(property_list, c_Analyse, &t_save); while (t_property) { std::string str_pro(t_property); result.push_back(atoi(str_pro.c_str())); t_property = strtok_r(t_save, c_Analyse, &t_save); } return result; } //void RtspAnalysElement::setDataByType(Json::Value& json,const SdkRule& rule) //{ // std::string camId=rule.strCamId.toStdString(); // sdkRuleMap[rule.nSdkType].weekRuleVec=m_lDBTool->searchCameraWeekRuleByCamId(rule.strCamId,rule.nSdkType); // switch (rule.nSdkType) // { // case FaceSdk: // { // json["face.enable"] = "1"; // appPref.setFloatData(camId+"face.det",rule.nQuality); // appPref.setFloatData(camId+"face.cmp",rule.nThreshold); // break; // } // case CarSdk: // { // // DBG("XX.enable " << "1"); // appPref.setFloatData(camId+"xx.det",rule.nQuality); // appPref.setFloatData(camId+"xx.cmp",rule.nThreshold); // break; // } // case YoloSdk: // { // json["yolo.enable"] = "1"; // appPref.setFloatData(camId+"yolo.det",rule.nQuality); // appPref.setFloatData(camId+"yolo.cmp",rule.nThreshold); // break; // } // case PerimeterSdk: // { // // auto rule=m_lDBTool->searchPerimeterRuleByCamId(camId); // json["perimeter.enable"] = 1; // json["perimeter.area"]=rule.strAreas.toStdString(); // json["perimeter.num"]=rule.nAlarmNumLowerLimit; // json["perimeter.delay"]=rule.nTriggerDelay; // json["perimeter.tolerance"]=rule.nTriggerTolerance; // appPref.setFloatData(camId+"perimeter.det",rule.nQuality); // appPref.setFloatData(camId+"perimeter.cmp",rule.nThreshold); // break; // } // case CrowdSdk: // { // json["crowd.enable"] = 1; // json["crowd.area"]=rule.strAreas.toStdString(); // json["crowd.num"]=rule.nAlarmNumLowerLimit; // json["crowd.delay"]=rule.nTriggerDelay; // json["crowd.tolerance"]=rule.nTriggerTolerance; // appPref.setFloatData(camId+"crowd.det",rule.nQuality); // appPref.setFloatData(camId+"crowd.cmp",rule.nThreshold); // break; // } // case KeepRightSdk: // { // json["keepRight.enable"] = 1; // json["keepRight.leftArea"]=rule.strAreas.toStdString(); // json["keepRight.leftLine"]=rule.strLine.toStdString(); // json["keepRight.rightArea"]=rule.strExAreas.toStdString(); // json["keepRight.rightLine"]=rule.strExLine.toStdString(); // json["keepRight.delay"]=rule.nTriggerDelay; // json["keepRight.tolerance"]=rule.nTriggerTolerance; // appPref.setFloatData(camId+"keepRight.det",rule.nQuality); // appPref.setFloatData(camId+"keepRight.cmp",rule.nThreshold); // break; // } // default: // break; // } //}