#include "AppPipeController.h" #include #include #include #include #include #include #include #include //AppPipeController::AppPipeController(std::string folderPath, const Json::Value &json) : // videoCaptureElement("filePath", 25, -1, appPref.getIntData("gpu.index")), m_index(0), // m_folderPath(folderPath), // m_json(json), fdfsClient(nullptr), yoloRpcElement(folderPath + "yoloRpc"), faceRpcElement(folderPath + "faceRpc"), // faceExtractElement(folderPath + "faceExtract"), triggerElement(25, 10), // recordVideoElement(-1, json["rtsp"].asString()), bRecordVideoEnable(false) { // init(); //} AppPipeController::AppPipeController(std::string folderPath, const SdkRuleMap &ruleMap) : m_rpcClient("RtspAnalysServer", "127.0.0.1",appPref.getIntData("RpcVTIMPort"),"tcp"), videoCaptureElement("filePath", 25, -1, appPref.getIntData("gpu.index")), // videoCaptureElement(40), m_index(0), m_folderPath(folderPath), m_sdkRuleMap(ruleMap), fdfsClient(nullptr), yoloRpcElement(folderPath + "yoloRpc"), faceRpcElement(folderPath + "faceRpc", ruleMap[FaceSdk]), faceExtractElement(folderPath + "faceExtract", ruleMap[FaceSdk]), triggerElement(25, 10), // recordVideoElement(-1, ""), bRecordVideoEnable(false), m_bSetWH(false) { init(); } //AppPipeController::AppPipeController(int index, const Json::Value &json, bool RecordVideoEnable) : // videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getIntData("gpu.index"), RecordVideoEnable), // m_index(index), fdfsClient(nullptr), yoloRpcElement(to_string(index) + "yoloRpc"), // faceRpcElement(to_string(index) + "faceRpc"), m_json(json), faceExtractElement(to_string(index) + "faceExtract"), // triggerElement(25, 4), recordVideoElement(index, json["rtsp"].asString()), bRecordVideoEnable(RecordVideoEnable) { // init(); //} //AppPipeController::AppPipeController(std::string camId, const Json::Value &json, bool RecordVideoEnable) : // videoCaptureElement(json["rtsp"].asString(), 25, 3000, appPref.getIntData("gpu.index")), // m_index(0), // m_camId(camId), // fdfsClient(nullptr), // yoloRpcElement(camId + "yoloRpc"), // faceRpcElement(camId + "faceRpc"), // m_json(json), // faceExtractElement(camId + "faceExtract"), // triggerElement(25, 4), // recordVideoElement(camId, json["rtsp"].asString()), // newRecordVideoElement(camId), // perimeterElement(1), // crowdElement(json["crowd.num"].asInt()), // bRecordVideoEnable(RecordVideoEnable) //{ // init(); // initPerimeter(); // initCrowd(); // intKeepRight(); //} AppPipeController::AppPipeController(std::string camId, const SdkRuleMap &ruleMap, bool RecordVideoEnable) : m_rpcClient("RtspAnalysServer", "127.0.0.1",appPref.getIntData("RpcVTIMPort"),"tcp"), videoCaptureElement(appPref.getStringData(camId + "rtsp"), 25, 3000, appPref.getIntData("gpu.index")), // videoCaptureElement(40), m_index(0), m_camId(camId), fdfsClient(nullptr), yoloRpcElement(camId + "yoloRpc"), faceRpcElement(camId + "faceRpc", ruleMap[FaceSdk]), faceExtractElement(camId + "faceExtract", ruleMap[FaceSdk]), triggerElement(25, 4), // recordVideoElement(camId, appPref.getStringData(camId + "rtsp")), // newRecordVideoElement(camId), perimeterElement(ruleMap[PerimeterSdk]), crowdElement(ruleMap[CrowdSdk]), perStaticElement(ruleMap[PerStaticSdk]), perHubElement(ruleMap[PerHubSdk]), leftJudgment(ruleMap[KeepRightSdk]), rightJudgment(ruleMap[KeepRightSdk]), bRecordVideoEnable(RecordVideoEnable), m_sdkRuleMap(ruleMap), m_bSetWH(false) { DBG("camId" << camId); init(); initPerimeter(); initCrowd(); initKeepRight(); initPerHub(); initPerStatic(); } AppPipeController::~AppPipeController() { } //************************************ // Method: string_replace // FullName: string_replace // Access: public // Returns: void // Qualifier: 把字符串的strsrc替换成strdst // Parameter: std::string & strBig // Parameter: const std::string & strsrc // Parameter: const std::string & strdst //************************************ static void string_replace(std::string &strBig, const std::string &strsrc, const std::string &strdst) { std::string::size_type pos = 0; std::string::size_type srclen = strsrc.size(); std::string::size_type dstlen = strdst.size(); while ((pos = strBig.find(strsrc, pos)) != std::string::npos) { strBig.replace(pos, srclen, strdst); pos += dstlen; } } bool AppPipeController::resetVideoCapturePath(std::string path) { // videoCaptureElement.stop(); // videoCaptureElement.wait(); string_replace(path, "//", "/"); videoCaptureElement.setVideoPath(path); auto dev_pos = path.find("/cut/") + 5; auto ch_pos = path.find("/", dev_pos) + 1; auto str_device_id = path.substr(dev_pos, ch_pos - dev_pos - 1); auto str_ch_id = path.substr(ch_pos, path.find("/", ch_pos) - ch_pos); faceExtractElement.setProperty("dev_id", str_device_id); faceExtractElement.setProperty("ch_id", str_ch_id); faceExtractElement.setProperty("path", path); personElement.setProperty("dev_id", str_device_id); personElement.setProperty("ch_id", str_ch_id); personElement.setProperty("path", path); //修改时间为实际发生时间 QString strPath = QString::fromStdString(path); QStringList list = strPath.split("/"); QString fileName; QString time; QString strNewTime; if (list.size() != 0) { fileName = list.last(); time = fileName.split(".").first(); //#todo // time = fileName.split("_").first(); } else { ERR("list.size() == 0)"); } if (!time.isEmpty()) { m_dt = QDateTime::fromString(time, "yyyy-MM-dd hh:mm:ss"); } else { m_dt = QDateTime::currentDateTime(); } // deciceId // chenle } bool AppPipeController::getRunning() { //return videoCaptureElement.isRunning(); return false; } string test_str; void AppPipeController::RecordVideo() { /*std::string imgKeyYolo = yoloRpcElement.getProperty("imgKey"); std::string imgKeyFace = faceRpcElement.getProperty("imgKey"); if(faceRpcElement.getTriggerState() || personElement.getTriggerState() || leftJudgment.getTriggerState() || rightJudgment.getTriggerState() || perimeterElement.getTriggerState() || crowdElement.getTriggerState() || perHubElement.getTriggerState() || perStaticElement.getTriggerState()) { try { auto server = rpcClient.getServer(); if (!server) { ERR("server is null"); return; } if(imgKeyFace != imgKeyYolo) { server->recordVideo(imgKeyFace); server->recordVideo(imgKeyYolo); INFO("Record Video Face: "<recordVideo(imgKeyFace); } } catch (std::exception &e) { ERR("Record Video ImgKeyFace: "< 0) { if (!faceRpcElement.isBusy()) { //#todo faceRpcElement.setProperty("time", strNewTime); faceRpcElement.setProperty("imgKey", imgKey); INFO("Write To FaceRPC ES time:" << strNewTime << " ImgKey: " << imgKey); faceRpcElement.setImage(imageTemp); faceRpcElement.submit(); } if (!yoloRpcElement.isBusy()) { //#todo yoloRpcElement.setProperty("time", strNewTime); yoloRpcElement.setProperty("imgKey", imgKey); INFO("Write To YoloES time:" << strNewTime << " ImgKey: " << imgKey); yoloRpcElement.setImage(imageTemp); yoloRpcElement.submit(); } if (appPref.getIntData("show.image") == 1 && !imageDrawElement.isBusy()) { imageDrawElement.setImage(imageTemp); imageDrawElement.submit(); } //this->RecordVideo(); /*if(faceRpcElement.getTriggerState() || personElement.getTriggerState() || leftJudgment.getTriggerState() || rightJudgment.getTriggerState() || perimeterElement.getTriggerState() || crowdElement.getTriggerState() || perHubElement.getTriggerState() || perStaticElement.getTriggerState()) { try { auto server = rpcClient.getServer(); if (!server) { ERR("server is null"); return; } INFO("Record Video "<recordVideo(imgKey); } catch (std::exception &e) { ERR("Record Video Err: "<RecordVideo(); }); faceRpcElement.registerConnector([&] { imageDrawElement.setFaces(faceRpcElement.getLastScoreRects()); //INFO("Record Video By Face"); //this->RecordVideo(); }); yoloRpcElement.registerConnector("YoloTrigger", [&] { // auto images = yoloRpcElement.getTriggerMats(); //INFO("Record Video By Yolo"); //this->RecordVideo(); }); faceRpcElement.registerConnector("FaceTrigger", [&] { // auto images = faceRpcElement.getTriggerMats(); faceExtractElement.submitFaceExtract({faceRpcElement.getProperty("uuid"), AppUtil::getTimeString(), faceRpcElement.getImage().clone(), faceRpcElement.getTriggerFaces(), faceRpcElement.getTriggerScoreRects(), faceRpcElement.getTriggerMats()}); //INFO("Record Video By Face"); //this->RecordVideo(); }); imageDrawElement.registerConnector([&] { if (appPref.getIntData("show.image") == 1) { ImageShowElement::showImage(to_string(this->m_index), *imageDrawElement.getImage()); } }); registerElement(videoCaptureElement); if (m_sdkRuleMap[YoloSdk].nIsRun == 1) { registerElement(personElement); } if (m_sdkRuleMap[FaceSdk].nIsRun == 1) { DBG("FaceSdk=" << m_sdkRuleMap[FaceSdk].nIsRun); registerElement(faceRpcElement); registerElement(faceExtractElement); } if (appPref.getIntData("show.image") == 1) { imageDrawElement.registerConnector([&] { ImageShowElement::showImage(to_string(this->m_index), *imageDrawElement.getImage()); }); registerElement(imageDrawElement); } // registerElement(newRecordVideoElement); //videoCaptureElement.setOutPutInterval(3); faceExtractElement.setProperty("index", to_string(m_index)); registerElement(yoloRpcElement); //#todo setProperty // faceExtractElement.setProperty("index", to_string(m_index)); // faceExtractElement.setProperty("index", to_string(m_index)); } std::string AppPipeController::getFullFileName() { string tmppath = appConfig.getStringProperty("cutPath"); auto findCutSize = tmppath.begin() + tmppath.find("/cut"); if (tmppath.back() != '/') { tmppath.push_back('/'); } string t_FilePath = tmppath; // string t_FilePath = tmppath.replace(findCutSize, findCutSize + 4, "/realtime/"); //# ./camIndex/YYYYMM/DD/camIndex-YYYYMMDDHHMMSS/ //# ./camIndex/YYYYMM/DD/ string t_strTime = AppUtil::getTimeSecString(); // 2018-09-01 11:30:48.mp4 t_FilePath.append( m_camId + "/" + t_strTime.substr(0, 4) + t_strTime.substr(5, 2) + "/" + t_strTime.substr(8, 2) + "/"); //camIndex-YYYYMMDDHH/ string tt = t_strTime; //2018-09-27 14:26:58 //#todo 优化 tt.erase(16, 1); tt.erase(13, 1); tt.erase(10, 1); tt.erase(7, 1); tt.erase(4, 1); //20180927142658 t_FilePath.append(m_camId + "-" + tt.substr(0, 10) + "/"); string t_cmd = "mkdir -p '"; t_cmd.append(t_FilePath + "'"); //#get path mkdir path system(t_cmd.c_str()); //#get time and file name t_FilePath.append(t_strTime + ".mp4"); return t_FilePath; } void AppPipeController::setfdfsClient(FastFdsWithLock *p_fdfsClient) { fdfsClient = p_fdfsClient; faceExtractElement.setFdfs(fdfsClient); personElement.setFdfs(fdfsClient); perHubElement.setFdfs(fdfsClient); perimeterElement.setFdfs(fdfsClient); perStaticElement.setFdfs(fdfsClient); leftJudgment.setFdfs(fdfsClient); rightJudgment.setFdfs(fdfsClient); crowdElement.setFdfs(fdfsClient); } std::string AppPipeController::getRtmp() { std::string ret = "";// = videoPublishElement.getPath(); size_t pos = ret.find(".flv"); ret = ret.substr(0, pos); INFO(ret); return ret; } void AppPipeController::initPerimeter() { SdkRule rule = m_sdkRuleMap[PerimeterSdk]; if (rule.nIsRun != 1) { return; } yoloRpcElement.registerConnector([&] { if (!perimeterElement.isBusy()) { perimeterElement.setYoloObjects(yoloRpcElement.getLastScoreRects()); perimeterElement.setImage(yoloRpcElement.getImage()); perimeterElement.submit(); } }); // perimeterElement.registerConnector([&] { // peTriggerElement.setState(perimeterElement.getRealNum() > 0); // peTriggerElement.triggerOnce(); // }); // peTriggerElement.registerConnector([&] { // switch (peTriggerElement.getTriggerType()) { // case UP: DBG("peTriggerElement Up"); // // startRecord(SdkType_Perimeter); // break; // case DOWN: DBG("peTriggerElement Down"); // // endRecord(SdkType_Perimeter); // default: // break; // } // }); registerElement(perimeterElement); // registerElement(peTriggerElement); } void AppPipeController::initCrowd() { SdkRule rule = m_sdkRuleMap[CrowdSdk]; if (rule.nIsRun != 1) { return; } // std::string area = m_json["crowd.area"].asString(); //area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]"; crowdElement.setProperty("local_ip", m_localIp); yoloRpcElement.registerConnector([&] { if (!crowdElement.isBusy()) { crowdElement.setYoloObjects(yoloRpcElement.getLastScoreRects()); crowdElement.setImage(yoloRpcElement.getImage()); crowdElement.submit(); } }); registerElement(crowdElement); // registerElement(crowdTriggerElement); } void AppPipeController::initKeepRight() { SdkRule rule = m_sdkRuleMap[KeepRightSdk]; if (rule.nIsRun != 1) { return; } leftJudgment.setProperty("local_ip", m_localIp); rightJudgment.setProperty("local_ip", m_localIp); leftJudgment.init(rule.strAreas, rule.strLine); rightJudgment.init(rule.strExAreas, rule.strExLine); yoloRpcElement.registerConnector([&] { if (!leftJudgment.isBusy()) { leftJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects()); leftJudgment.setImage(yoloRpcElement.getImage()); leftJudgment.submit(); } if (!rightJudgment.isBusy()) { rightJudgment.setYoloObjects(yoloRpcElement.getLastScoreRects()); rightJudgment.setImage(yoloRpcElement.getImage()); rightJudgment.submit(); } }); registerElement(leftJudgment); registerElement(rightJudgment); } void AppPipeController::initPerStatic() { SdkRule rule = m_sdkRuleMap[PerStaticSdk]; if (rule.nIsRun != 1) { return; } // std::string area = m_json["crowd.area"].asString(); //area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]"; perStaticElement.setProperty("local_ip", m_localIp); yoloRpcElement.registerConnector([&] { if (!perStaticElement.isBusy()) { perStaticElement.setYoloObjects(yoloRpcElement.getLastScoreRects()); perStaticElement.setImage(yoloRpcElement.getImage()); perStaticElement.submit(); } }); registerElement(perStaticElement); } void AppPipeController::initPerHub() { SdkRule rule = m_sdkRuleMap[PerHubSdk]; if (rule.nIsRun != 1) { return; } // std::string area = m_json["crowd.area"].asString(); //area="[{\"x\":100,\"y\":6},{\"x\":100,\"y\":1200},{\"x\":1800,\"y\":1200},{\"x\":1800,\"y\":6}]"; perHubElement.setProperty("local_ip", m_localIp); yoloRpcElement.registerConnector([&] { if (!perHubElement.isBusy()) { perHubElement.setYoloObjects(yoloRpcElement.getLastScoreRects()); perHubElement.setImage(yoloRpcElement.getImage()); perHubElement.submit(); } }); registerElement(perHubElement); }