From f946a62d3921e86b44ff8e2973138304b9cd53cd Mon Sep 17 00:00:00 2001 From: chenshijun <csj_sky@126.com> Date: 星期二, 16 四月 2019 16:36:32 +0800 Subject: [PATCH] 解决修改参数和推流画面跳跃问题 --- QiaoJiaSystem/DataManagerServer/http_configserver.cpp | 214 +++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 157 insertions(+), 57 deletions(-) diff --git a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp index 3e580ce..85d8485 100644 --- a/QiaoJiaSystem/DataManagerServer/http_configserver.cpp +++ b/QiaoJiaSystem/DataManagerServer/http_configserver.cpp @@ -22,6 +22,7 @@ #include <time.h> #include <dirent.h> #include "basic/pipe_element/ffmpeg/basic_struct_for_video_image.h" +#include <basic/timer_counter/Clocktimer.h> #include "vss/controller/VssDevTblController.h" #include "vss/controller/VssChannelTblController.h" @@ -73,6 +74,10 @@ void devHttpServer_c::init(void) { std::string strDevId = appConfig.getStringProperty("DEV_ID"); + + //nsq + nsqMsgProducer = new BasicMsg::Nsq::NsqMsgProducer("127.0.0.1", "4150"); + nsqMsgProducer->init(); // DSVAD010120181119 m_batch = strDevId.substr(5, 2); @@ -257,6 +262,8 @@ VssDomainUnitTblController::instance()->registerHttpServices(_HttpSrvRetRecieve); VssLocalSettingTblController::instance()->registerHttpServices(_HttpSrvRetRecieve); CamDevController::instance()->registerHttpServices(_HttpSrvRetRecieve); + //todo + CamDevController::instance()->nsqMsgProducerSet(nsqMsgProducer); VssUpperSvrTblController::instance()->registerHttpServices(_HttpSrvRetRecieve); @@ -1114,6 +1121,17 @@ if (DEV_NO_TYPE == dev_type) {//add new camera db_c.updateConfigTableByDevType(DEV_CAMERA); + { + //#todo +// std::string topic = "VideoToImageMulth"; +// std::string topic1 = "VideoAnalysFromHC"; +// Json::Value json_cfg; +// json_cfg["cam_edit"] = content; +// std::string msg = json_cfg.toStyledString(); +// DBG("msg:" << msg); +// nsqMsgProducer->Publish(topic, (void *) (&msg)); +// nsqMsgProducer->Publish(topic1, (void *) (&msg)); + } runAllApp(); } //edit camera's sdks @@ -1121,9 +1139,20 @@ (rec_sdk_old.str_det_thr != rec_sdk.str_det_thr) || (rec_sdk_old.str_cmp_thr != rec_sdk.str_cmp_thr)) */ { - killVideoAnalysFromHCApp(); - sleep(1); - runAllApp(); + //#todo sendMessage To haikang&VideoToImage + { + std::string topic = "VideoToImageMulth"; + std::string topic1 = "VideoAnalysFromHC"; + Json::Value json_cfg; + json_cfg["cam_edit"] = content; + std::string msg = json_cfg.toStyledString(); + DBG("msg:" << msg); + nsqMsgProducer->Publish(topic, (void *) (&msg)); + nsqMsgProducer->Publish(topic1, (void *) (&msg)); + } +// killVideoAnalysFromHCApp(); +// sleep(1); +// runAllApp(); } Json::Value value_out; @@ -1137,11 +1166,11 @@ std::string brand) const { if (brand == "haikang") { - bool ret = getHKDevSerialNumber(ip.c_str(), port, username.c_str(), passwd.c_str()); - if (!ret) { - ERR("getHKDevSerialNumber ERR"); - return false; - } +// bool ret = getHKDevSerialNumber(ip.c_str(), port, username.c_str(), passwd.c_str()); +// if (!ret) { +// ERR("getHKDevSerialNumber ERR"); +// return false; +// } //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream port = 554;//TODO // std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + @@ -1167,8 +1196,8 @@ std::string publish_basepath = rtmpAddr + "cam" + str_uuid; DBG("publish_basepath:" << publish_basepath); appPref.setStringData("publish.basepath", publish_basepath); - appPref.setIntData("pulish.width", 640); - appPref.setIntData("pulish.height", 360); +// appPref.setIntData("pulish.width", 1920); +// appPref.setIntData("pulish.height", 1080); if (m_rtmp.find(ip) != m_rtmp.end()) { if (m_rtmp[ip].appPC == nullptr) { @@ -1191,11 +1220,11 @@ return false;//TODO } else if (brand == "yushi") { // rtsp://admin:admin@192.168.8.8:554/video1 - bool ret = getUVDevSerialNumber(ip.c_str(), username.c_str(), passwd.c_str()); - if (!ret) { - ERR("getUVDevSerialNumber ERR"); - return false; - } +// bool ret = getUVDevSerialNumber(ip.c_str(), username.c_str(), passwd.c_str()); +// if (!ret) { +// ERR("getUVDevSerialNumber ERR"); +// return false; +// } port = 554; // std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + @@ -1220,8 +1249,8 @@ std::string publish_basepath = rtmpAddr + "cam" + str_uuid; DBG("publish_basepath:" << publish_basepath); appPref.setStringData("publish.basepath", publish_basepath); - appPref.setIntData("pulish.width", 640); - appPref.setIntData("pulish.height", 360); +// appPref.setIntData("pulish.width", 1920); +// appPref.setIntData("pulish.height", 1080); if (m_rtmp.find(ip) != m_rtmp.end()) { if (m_rtmp[ip].appPC == nullptr) { @@ -1267,6 +1296,7 @@ if (m_rtmp[ip].userCounter == 0) { m_rtmp[ip].appPC->stop(); m_rtmp[ip].appPC->wait(); + delete m_rtmp[ip].appPC; m_rtmp.erase(ip); } } @@ -1291,28 +1321,41 @@ } Json::Value value; if (value_reader.isMember("id")) { - if (value_reader["id"].isNull()) return "{\"ret_status\": \"id鍐呭鏈夎锛岃妫�鏌ワ紒\"}"; - value["connect_status"] = "True"; - std::string rtmp_url = appConfig.getStringProperty("srsAddr"); - rtmp_url.append("cam").append(value_reader["id"].asCString()); - value["video_url"] = rtmp_url; - out = value.toStyledString(); - - } else { - //TODO - //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream + if (value_reader["id"].isNull()) { + //鏈湴瑙嗛婧� 绗竴娆℃祴璇曡繛鎺� + //TODO + //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream // std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + "/h264/ch1/main/av_stream"; - bool ret = cam_connect_video_start(value_reader["str_ip"].asString(), value_reader["n_port"].asInt(), \ + bool ret = cam_connect_video_start(value_reader["str_ip"].asString(), value_reader["n_port"].asInt(), \ value_reader["str_username"].asString(), value_reader["str_password"].asString(), \ value_reader["str_brand"].asString()); - if (!ret) { + if (!ret) { + return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}"; + } + std::string rtmp_url = m_rtmp[value_reader["str_ip"].asCString()].appPC->getRtmp(); + value["connect_status"] = "True"; + value["video_url"] = rtmp_url; + out = value.toStyledString(); + } else if (!value_reader["type"].isNull()) { + + value["connect_status"] = "True"; + std::string rtmp_url = appConfig.getStringProperty("srsAddr"); + rtmp_url.append("cam").append(value_reader["id"].asCString()); + value["video_url"] = rtmp_url; + out = value.toStyledString(); + { + std::string topic = "VideoToImageMulth"; + Json::Value json_cfg; + json_cfg["cam_startPublish"] = content; + std::string msg = json_cfg.toStyledString(); + DBG("msg:" << msg); + nsqMsgProducer->Publish(topic, (void *) (&msg)); + } + } else { return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}"; } - - std::string rtmp_url = m_rtmp[value_reader["str_ip"].asCString()].appPC->getRtmp(); - value["connect_status"] = "True"; - value["video_url"] = rtmp_url; - out = value.toStyledString(); + } else { + return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}"; } return out; @@ -1330,19 +1373,32 @@ if (!reader.parse(content, value_reader)) { return "{\"ret_status\": \"浼犺緭閿欒锛岃妫�鏌ワ紒\"}"; } - - //TODO - //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream -// std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + "/h264/ch1/main/av_stream"; - DBG("cam_connect_video_stop begin"); - bool ret = cam_connect_video_stop(value_reader["str_ip"].asString()); - if (!ret) { - return "{\"ret_status\": \"浼犺緭閿欒锛岃妫�鏌ワ紒\"}"; - } - DBG("cam_connect_video_stop end"); - Json::Value value; - value["ret_status"] = "ok_ack"; + if (value_reader.isMember("id")) { + value["ret_status"] = "ok_ack"; + cam_connect_video_stop(value_reader["str_ip"].asString()); + { + std::string topic = "VideoToImageMulth"; + Json::Value json_cfg; + json_cfg["cam_stopPublish"] = content; + std::string msg = json_cfg.toStyledString(); + DBG("msg:" << msg); + nsqMsgProducer->Publish(topic, (void *) (&msg)); + } + } else { + //TODO + //璋冪敤rtsp娴乺tsp://admin:a1234567@192.168.1.215:554/h264/ch1/main/av_stream +// std::string rtsp_url = "rtsp://" + username + ":" + passwd + "@" + ip + ":" + std::to_string(port) + "/h264/ch1/main/av_stream"; + DBG("cam_connect_video_stop begin"); + bool ret = cam_connect_video_stop(value_reader["str_ip"].asString()); + if (!ret) { + return "{\"ret_status\": \"浼犺緭閿欒锛岃妫�鏌ワ紒\"}"; + } + DBG("cam_connect_video_stop end"); + + value["ret_status"] = "ok_ack"; + } + std::string out = value.toStyledString(); @@ -1403,12 +1459,22 @@ QString cam_id = QString::fromStdString(value_reader["str_cam_dev_id"].asString()); int ret = db_c.deleteCamDevandSdkByCamID(cam_id); if (ret) { - killVideoAnalysFromHCApp(); +// killVideoAnalysFromHCApp(); int dev_record = db_c.searchCamDevNumber(); if (dev_record == 0) { db_c.updateConfigTableByDevType(DEV_NO_TYPE); } else { - runAllApp(); +// runAllApp(); + } + { + std::string topic = "VideoToImageMulth"; + std::string topic1 = "VideoAnalysFromHC"; + Json::Value json_cfg; + json_cfg["cam_del"] = content; + std::string msg = json_cfg.toStyledString(); + DBG("msg:" << msg); + nsqMsgProducer->Publish(topic, (void *) (&msg)); + nsqMsgProducer->Publish(topic1, (void *) (&msg)); } return "{\"ret_status\": \"ok_ack\"}"; } else { @@ -1529,9 +1595,15 @@ } if (ret) { - killVideoAnalysFromHCApp(); - sleep(1); - runAllApp(); + //todo VideoToImageMulth + { + std::string topic = "VideoToImageMulth"; + Json::Value json_cfg; + json_cfg["cut_dura_edit"] = content; + std::string msg = json_cfg.toStyledString(); + DBG("msg:" << msg); + nsqMsgProducer->Publish(topic, (void *) (&msg)); + } return "{\"ret_status\": \"ok_ack\"}"; } else { return "{\"ret_status\": \"鍐呭鏈夎锛岃妫�鏌ワ紒\"}"; @@ -1703,25 +1775,32 @@ //#todo nodes have counter? //#todo nodeName Automatic generated? //#todo devId+num + // 鐢熸垚鑺傜偣id - uuid std::string uuid = GetUUId::getUUID(); + // 鑾峰彇褰撳墠鏈哄櫒ip unsigned char ip_old[15] = {0}; std::string str_netIfName = appConfig.getStringProperty("netIfName"); GetIpAddress(str_netIfName.c_str(), ip_old); std::string str_ip((char *) ip_old); + // 鑺傜偣鍚嶇О std::string nodeName = uuid.append("@" + str_ip); std::string cookie = value["cookie"].asString(); + // 寮曞鑺傜偣 std::string FatherNodeName = value["fatherNodeName"].asString(); //#todo ClusterID ClusterName + // 闆嗙兢id std::string clusterID = value["culID"].asString(); + // 涓虹┖鍒欑敓鎴�,鍚﹀垯鐩存帴浣跨敤 clusterID = clusterID.size() > 0 ? clusterID : GetUUId::getUUID(); std::string clusterName = value["culName"].asString(); + std::string devID = value["devID"].asString(); std::string devName = value["devName"].asString(); - + // erlang鑺傜偣淇濆瓨璺緞/opt/erlang/${uuid} std::string path = std::string("/opt/erlang/").append(nodeName.substr(0, nodeName.find("@"))); if (erlangDbTool != nullptr) { //gaunbi node @@ -1733,6 +1812,7 @@ if (cookie.size() > 0 && (clusterID.size() > 0 || clusterName.size() > 0)) { // erlangDbTool = new ErlangTool::ErlangDbTool(path, nodeName, cookie); + // #todo 杩涚▼鍚� -> get from argv[0] string str_tmp = "DataWebserver"; erlangDbTool = new ErlangTool::ErlangDbTool(path, nodeName, cookie, clusterID, clusterName, str_tmp); bool ret = erlangDbTool->initErlang(); @@ -1741,6 +1821,7 @@ ret = erlangDbTool->startNodeDb(FatherNodeName, devID); if (ret) { + //濡傛灉鎴愬姛鍒欐洿鏂伴厤缃枃浠� appConfig.setStringProperty("erlNode", nodeName); appConfig.setStringProperty("erlCookie", cookie); appConfig.setStringProperty("erlPath", path); @@ -1753,6 +1834,7 @@ runAllApp(); // sleep(4); } else { + // 鍚﹀垯鍒欑疆绌洪厤缃枃浠� appConfig.setStringProperty("erlNode", ""); appConfig.setStringProperty("erlCookie", ""); appConfig.setStringProperty("erlPath", ""); @@ -1785,6 +1867,7 @@ ret = erlangDbTool->removeNode(); + // 缃┖閰嶇疆鏂囦欢 appConfig.setStringProperty("erlNode", ""); appConfig.setStringProperty("erlCookie", ""); appConfig.setStringProperty("erlPath", ""); @@ -1902,15 +1985,20 @@ std::string Uuid = value["uuid"].asString(); std::string TableType = value["TableType"].asString(); std::string TableName = value["TableName"].asString(); + // 闆嗙兢鍐呭悓姝� int SyncType = atoi(value["SyncType"].asCString()); std::string BwType = value["BwType"].asString(); std::string StartTime = value["StartTime"].asString(); std::string EndTime = value["EndTime"].asString(); + // 鏄惁涓婁紶 std::string UploadFlag = value["IsSync"].asString(); UploadFlag = UploadFlag.empty() ? "0" : UploadFlag; + + // 搴曞簱闃堝�� std::string CmpThreshold = value["threshold"].asString(); CmpThreshold = CmpThreshold.empty() ? "60" : CmpThreshold; + // 鏄惁鍚敤 std::string Enabled = value["enabled"].asString(); Enabled = Enabled.empty() ? "1" : Enabled; @@ -1980,7 +2068,7 @@ // Enabled); // } - + // send message to other CNode erlangDbTool->sendMessage(); std::string str_result = std::string("{\"result\":").append("\"" + std::to_string(ret) + "\"}"); return str_result; @@ -2671,6 +2759,7 @@ std::string strSelectTemplate = R"#( -vf "select=eq(n\,%d)")#"; sprintf(selectExpBuff, strSelectTemplate.c_str(), frameIdDiff - 1); if (videoSt.Valid() && imgSt.Valid()) { + ClockTimer clockTimer1("ffmpeg getpic"); std::string cmd("ffmpeg -i '" + videoPath + "'" + std::string(selectExpBuff) + " -vframes 1" + " -y '" + str_imgName + "'"); INFO("Video To Image Cmd: " << cmd); @@ -2680,17 +2769,20 @@ return "{\"error\":\"鏈煡鍒拌棰戣矾寰刓"}"; } + ClockTimer clockTimer2("cv::imread(str_imgName)"); cv::Mat img = cv::imread(str_imgName); if (img.empty()) { ERR("{\"error\":\"Video File error\"}"); return "{\"error\":\"瑙嗛鏂囦欢閿欒\"}"; } + ClockTimer clockTimer3("CvUtil::cvMat2Buffer(img, buffer)"); std::vector<unsigned char> buffer; CvUtil::cvMat2Buffer(img, buffer); std::string img_url = "http://"; fdfsClient.rwLock.rdlock(); if (fdfsClient.fastFds != nullptr) { + ClockTimer clockTimer4("fdfsClient.fastFds->uploadFile"); std::string t_strImg = ""; if (!fdfsClient.fastFds->uploadFile(buffer, t_strImg, "jpg")) { img_url = "upload image fail"; @@ -3262,11 +3354,19 @@ if (db_c.updateSdkRule(rule)) { // if(rule.nIsRun==1) - killVideoAnalysFromHCApp(); - sleep(1); - runAllApp(); +// killVideoAnalysFromHCApp(); +// sleep(1); +// runAllApp(); - + { + std::string topic = "VideoAnalysFromHC"; + Json::Value json_cfg; + json_cfg["editSdkRule"] = content; + std::string msg = json_cfg.toStyledString(); + DBG("msg:" << msg); + usleep(1000); + nsqMsgProducer->Publish(topic, (void *) (&msg)); + } return "{\"ret_status\": \"ok_ack\"}"; } else { return "{\"ret_status\":\"鍐呭鏈夎锛岃妫�鏌ワ紒\"}"; -- Gitblit v1.8.0