pansen
2019-03-06 a2dfb4907fd11e0a64ba16419dce066509462297
修改部分bug
11个文件已修改
484 ■■■■ 已修改文件
QiaoJiaSystem/EncodeServer/CMakeLists.txt 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/StructureApp/FaceExtractElement.cpp 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp 257 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/VideoToImageMulth/main.cpp 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
QiaoJiaSystem/EncodeServer/CMakeLists.txt
@@ -56,12 +56,10 @@
    ../../../BasicPlatForm/basic/pipe/
    ../../../BasicPlatForm/libs/opencv/include
    ../../../BasicPlatForm/libs/ffmpeg/include
    ../../../BasicPlatForm/libs/jsoncpp/include
    /usr/include/x86_64-linux-gnu/qt5
@@ -79,22 +77,23 @@
    ../../../BasicPlatForm/libs/ffmpeg/lib
    ../../../BasicPlatForm/libs/jsoncpp/lib
#    ../../../BasicPlatForm/libs/libuuid/lib
    #    ../../../BasicPlatForm/libs/libuuid/lib
    ../../../BasicPlatForm/libs/hiredis-master/lib
)
add_executable(${PROJECT_NAME}
      ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
       ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
       ../StructureApp/NewRecordVideoElement.cpp
       ../../../BasicPlatForm/basic/timer_counter/TimerRecorder.cpp
    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/VideoChangeScore.cpp
    ../../../BasicPlatForm/basic/pipe_element/ffmpeg/FfmpegElement.cpp
    ../StructureApp/NewRecordVideoElement.cpp
    ../../../BasicPlatForm/basic/timer_counter/TimerRecorder.cpp
    ../../../BasicPlatForm/basic/util/BASE64/Base64.cpp
        EncodeVideoManager.cpp
       EncodeVideo.cpp
       ../StructureApp/HiredisTool.cpp
       main.cpp
    EncodeVideoManager.cpp
    EncodeVideo.cpp
    ../StructureApp/HiredisTool.cpp
    main.cpp
    )
target_link_libraries(${PROJECT_NAME}
    ${LIBS}
QiaoJiaSystem/GB28181DecoderModel/FFmpegDecoderJPG.cpp
@@ -128,6 +128,10 @@
    return bufsize;
}
/***
 * 解码线程
 * @param p_this
 */
void BASICGB28181::FFmpegDecoderJPG::BareFlowDecoderThd(FFmpegDecoderJPG *p_this) {
    DBG(p_this->m_camIdx << "  BareFlowDecoderThd ok ... gpuIdx is " << p_this->m_gpuIdx);
    p_this->m_running = true;
@@ -188,11 +192,6 @@
        //# todo save package
        p_this->frame_number++;
        //DBG("GotPicture "<<m_camId<<":"<<frame_number);
        //放在此处是因为之前放在前面,收到的帧不完成
        p_this->SaveToPacketVector(pkt);
        p_this->CheckSave();
        int err6 = avcodec_send_packet(ctx, &pkt);
        av_packet_unref(&pkt);
        int err7 = avcodec_receive_frame(ctx, frame);
@@ -201,12 +200,17 @@
            usleep(40000);
            continue;
        }
        //DBG("GotPicture "<<m_camId<<":"<<frame_number);
        //放在此处是因为之前放在前面,收到的帧不完成
        p_this->SaveToPacketVector(pkt);
        p_this->CheckSave();
//        BASICGB28181::avframe_to_cvmat(frame).copyTo(p_this->m_image);
        p_this->m_image = std::move(BASICGB28181::avframe_to_cvmat(frame));
#ifdef TestCode
        {
//            TestCode
//            TestCode 测试代码保存图片到本地
            ClockTimer cl("TestCode");
            std::string strNewTime2 = AppUtil::getTimeUSecString();
            cv::putText(p_this->m_image, strNewTime2, cv::Point(408, 540), cv::HersheyFonts::FONT_HERSHEY_PLAIN,
@@ -228,7 +232,7 @@
#ifdef TestCode
        DBG("emitSigal(\"DecoderImageOK\") begin");
#endif
        //触发信号
        gSignalLock.emitSigal(p_this->m_camIdx + "DecoderImageOK");
//#ifdef TestCode
//        DBG("emitSigal(\"DecoderImageOK\") after");
@@ -278,7 +282,7 @@
bool BASICGB28181::FFmpegDecoderJPG::stopThd() {
    TryCath(
        DBG(m_camIdx << "  FFmpegDecoderJPG stopThd ... ");
        DBG(m_camIdx << "  FFmpegDecoderJPG stopThd ... " << m_camIdx);
        m_running = false;
    );
    return true;
@@ -380,9 +384,11 @@
        int64_t firstKeyFrameDts = m_packetsVec[0].m_packet.dts;
        for (const auto &item:m_packetsVec) {
            if (item.m_frameId < lastFrameId) {
                DBG("item.m_frameId < lastFrameId   " << item.m_frameId << "  " << lastFrameId);
                conversion(const_cast<AVPacket *> (&item.m_packet), firstKeyFramePts, firstKeyFrameDts, video_st);
                av_write_frame(m_pOutFmtCtx, &item.m_packet);
            } else {
                DBG("item.m_frameId > lastFrameId   " << item.m_frameId << "  " << lastFrameId);
                break;
            }
        }
QiaoJiaSystem/GB28181DecoderModel/GB28181Server.cpp
@@ -2,6 +2,7 @@
// Created by ps on 19-3-1.
//
#include <basic/debug/Debug.h>
#include "GB28181Server.h"
bool bGetLoaclRes = {false};
@@ -50,6 +51,7 @@
bool GB28181Server::initServer() {
    bool iRet = C_InitSDK(&GBServerParam, &MysqlConnParam, NULL, enventcallback);
    DBG("iRet is " << iRet);
    sleep(90);
    return iRet;
QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.cpp
@@ -13,12 +13,10 @@
BASICGB28181::VideoCaptureElementWithRtp::VideoCaptureElementWithRtp(std::string &chanPubID, int fps,
                                                                     int streamTransType,
                                                                     int gpuIdx) : m_chanPubID(chanPubID), m_fps(fps),
                                                                                   m_running(false),
                                                                                   m_waitSignal(false),
                                                                                   m_streamTransType(streamTransType),
                                                                                   m_gpuIdx(gpuIdx),
                                                                                   m_userdata((long) this) {
                                                                     int gpuIdx, RtspAnalysManager *manager)
    : m_chanPubID(chanPubID), m_fps(fps), m_running(false),
      m_waitSignal(false), m_streamTransType(streamTransType),
      m_gpuIdx(gpuIdx), m_userdata((long) this), m_pManager(manager) {
//    m_chanPubID = chanPubID;
    m_cutPath = appPref.getStringData("user.loop.absolute.path");
QiaoJiaSystem/GB28181DecoderModel/VideoCaptureElementWithRtp.h
@@ -17,7 +17,8 @@
    class VideoCaptureElementWithRtp : public basic::PipeElement {
    public:
        explicit VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1);
        explicit VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1,
                                            RtspAnalysManager *manager = nullptr);
        virtual ~VideoCaptureElementWithRtp();
QiaoJiaSystem/StructureApp/FaceExtractElement.cpp
@@ -123,6 +123,9 @@
                    strImgUrl = strImgUrlTmp;
//                    strImgUrl.append("/").append(strImgUrlTmp);
                    fdfsClient->rwLock.unlock();
                } else {
                    strImgUrl = "";
                    ERR("fdfsClient is nullptr ???");
                }
                //拼接json
QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.cpp
@@ -10,24 +10,24 @@
//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 "";
//}
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();
    resetFdfs();
    {
//        std::thread httpServer([&]() {
//            //#todo port
QiaoJiaSystem/VideoAnalysFromHC/RtspAnalysElement.h
@@ -21,7 +21,7 @@
    virtual ~RtspAnalysElement();
    int addCamera(const std::string &, const std::map<int, SdkRule>& sdkRuleMap);
    int addCamera(const std::string &, const std::map<int, SdkRule> &sdkRuleMap);
    int removeCamera(const std::string &);
@@ -36,7 +36,7 @@
private:
    void init();
//    std::string resetFdfs(std::string ip = "", unsigned int port = 0, std::string content = "");
    std::string resetFdfs(std::string ip = "", unsigned int port = 0, std::string content = "");
    static std::vector<int> chnString2Vec(std::string str_list);
QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.cpp
@@ -40,47 +40,69 @@
//初始化函数
void RtspAnalysManager::init() {
    INFO("MYH DEBUG HERE")
    m_GB28181_Enable = appPref.getIntData("GB28181_Enable");
    //#todo GB28181
#ifndef GB28181
    auto lst = m_lDBTool->searchCamDevTableAll();
    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
    if (m_GB28181_Enable) {
        auto lst = m_lDBTool->searchCamDevTableByType(1);
        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) {
        int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep");
        int CamCount = appPref.getIntData("CamStep");
        INFO("StartCamNO: " << startCamNO << " CamStep: " << CamCount);
        auto itor = lst.begin();
        if (startCamNO >= lst.size()) {
            ERR("startCamNO > lst.size()");
            return;
        //设置视频的最长和最短时间间隔
        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 = "GB28181";
//            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");
        }
        for (int i = 0; i < startCamNO; i++) {
    } else {
        auto lst = m_lDBTool->searchCamDevTableAll();
        Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
            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());
            INFO("JumpCam: " << t_camIdex << "  URL: " << rtsp_url);
            itor++;
        }
        //设置视频的最长和最短时间间隔
        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) {
            int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep");
            int CamCount = appPref.getIntData("CamStep");
            INFO("StartCamNO: " << startCamNO << " CamStep: " << CamCount);
            auto itor = lst.begin();
        for (int i = 0; i < CamCount; i++) {
            if (itor == lst.end()) {
                ERR("itor == lst.end()");
            if (startCamNO >= lst.size()) {
                ERR("startCamNO > lst.size()");
                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());
            INFO("cam add is " << itor->str_addr.toStdString());
            addCamera(t_camIdex, rtsp_url);
            itor++;
        }
            for (int i = 0; i < startCamNO; i++) {
                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());
                INFO("JumpCam: " << t_camIdex << "  URL: " << rtsp_url);
                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());
                INFO("cam add is " << itor->str_addr.toStdString());
                addCamera(t_camIdex, rtsp_url);
                itor++;
            }
//        for (auto item : lst)
//        {
@@ -92,65 +114,10 @@
//            addCamera(t_camIdex, rtsp_url);
//
//        }
    } else {
        ERR("searchCamDevTableAll size is 0");
    }
#else
    auto lst = m_lDBTool->searchCamDevTableByType(1);
    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) {
//        int startCamNO = appPref.getIntData("CamStart") * appPref.getIntData("CamStep");
//        int CamCount = appPref.getIntData("CamStep");
//        INFO("StartCamNO: " << startCamNO << " CamStep: " << CamCount);
//        auto itor = lst.begin();
//
//        if (startCamNO >= lst.size()) {
//            ERR("startCamNO > lst.size()");
//            return;
//        }
//        for (int i = 0; i < startCamNO; i++) {
//
//            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());
//            INFO("JumpCam: " << t_camIdex << "  URL: " << rtsp_url);
//            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());
//            INFO("cam add is " << itor->str_addr.toStdString());
//
//            addCamera(t_camIdex, rtsp_url);
//            itor++;
//        }
        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());
            INFO("cam add is " << item.str_addr.toStdString());
            addCamera(t_camIdex, rtsp_url);
        } else {
            ERR("searchCamDevTableAll size is 0");
        }
    } else {
        ERR("searchCamDevTableAll size is 0");
    }
#endif
}
RtspAnalysManager::~RtspAnalysManager() {
@@ -160,6 +127,11 @@
        delete controller.second;
    }
    m_controllers.clear();
    for (auto controller: m_controllers_videoCapElem) {
        INFO("Delete Controller: " << controller.first);
        delete controller.second;
    }
    m_controllers_videoCapElem.clear();
}
/**
@@ -171,9 +143,46 @@
 * @return -1 添加失败,0 添加成功
 */
int RtspAnalysManager::addCamera(const std::string &index, const std::string &rtsp) {
#ifndef GB28181
    //    why search lst ?
    //    auto lst = m_lDBTool->searchCamDevTableAll();
    if (m_GB28181_Enable) {
        //#todo
//    why search lst ?
//    auto lst = m_lDBTool->searchCamDevTableAll();
        Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
        //#todo end
        if (m_controllers_videoCapElem.find(index) == m_controllers_videoCapElem.end()) {
            INFO("MYH DEBUG HERE");
            if (m_currentCount >= m_maxCount) {
                ERR("addCamera faild, camera's num is full!")
                return -1;
            }
            INFO("RTSP: " << rtsp << "  INDEX:" << index);
            m_imgRedisCRwLock.wrlock();
            m_imgRedisControllers[index] = new RtspImageRedisElement(index);
            m_imgRedisControllers[index]->start();
            m_imgRedisCRwLock.unlock();
            //VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1)
            m_controllers_videoCapElem[index] = new BASICGB28181::VideoCaptureElementWithRtp(
                const_cast<string &>(index),
                25, 0, 0, this);
            m_controllers_videoCapElem[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration,
                                                                     lst_dev.n_cut_max_duration);
            m_controllers_videoCapElem[index]->start();
            m_currentCount++;
            return 0;
        } else {
            removeCamera(index);
            INFO("removeCamera " << index);
            //DBG("removeCamera " << index);
            return addCamera(index, rtsp);
        }
    } else {
        //    why search lst ?
        //    auto lst = m_lDBTool->searchCamDevTableAll();
        Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
        if (m_controllers.find(index) == m_controllers.end()) {
            INFO("MYH DEBUG HERE");
@@ -197,38 +206,12 @@
            //DBG("removeCamera " << index);
            return addCamera(index, rtsp);
        }
#else
    //#todo
//    why search lst ?
//    auto lst = m_lDBTool->searchCamDevTableAll();
    Record_Config lst_dev = m_lDBTool->searchConfigTableWithinServerInfo();
    //#todo end
    if (m_controllers_videoCapElem.find(index) == m_controllers_videoCapElem.end()) {
        INFO("MYH DEBUG HERE");
        if (m_currentCount >= m_maxCount) {
            ERR("addCamera faild, camera's num is full!")
            return -1;
        }
        INFO("RTSP: " << rtsp << "  INDEX:" << index);
        m_imgRedisControllers[index] = new RtspImageRedisElement(index);
        m_imgRedisControllers[index]->start();
        //VideoCaptureElementWithRtp(std::string &chanPubID, int fps, int streamTransType, int gpuIdx = -1)
        m_controllers_videoCapElem[index] = new BASICGB28181::VideoCaptureElementWithRtp(const_cast<string &>(index),
                                                                                         25, 1, 0);
        m_controllers_videoCapElem[index]->SetVideoMinMaxSeconds(lst_dev.n_cut_min_duration,
                                                                 lst_dev.n_cut_max_duration);
        m_controllers_videoCapElem[index]->start();
        m_currentCount++;
        return 0;
    } else {
        removeCamera(index);
        INFO("removeCamera " << index);
        //DBG("removeCamera " << index);
        return addCamera(index, rtsp);
    }
#ifndef GB28181
#else
#endif
}
@@ -258,11 +241,13 @@
    m_currentCount--;
#endif
    m_imgRedisCRwLock.wrlock();
    auto imgRedis = m_imgRedisControllers[index];
    imgRedis->stop();
    imgRedis->wait();
    delete imgRedis;
    m_imgRedisControllers.erase(index);
    m_imgRedisCRwLock.unlock();
    INFO("MYH DEBUG HERE");
    return 0;
}
@@ -294,6 +279,7 @@
#endif
    INFO("MYH DEBUG HERE");
    m_imgRedisCRwLock.wrlock();
    for (auto controller: m_imgRedisControllers) {
        controller.second->stop();
    }
@@ -302,6 +288,7 @@
        delete controller.second;
    }
    m_imgRedisControllers.clear();
    m_imgRedisCRwLock.unlock();
    m_currentCount = 0;
@@ -319,17 +306,26 @@
    return m_currentCount;
}
//录取视频的RPC的接口函数
::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);
        if (GB28181_Enable) {
            auto pCaptureElem = m_controllers_videoCapElem.find(nameSt.m_camId);
            if (pCaptureElem != m_controllers_videoCapElem.end()) {
//#todo ~~~~~~!!!!!!! 这里有bug 需要放开调试
//            pCaptureElem->second->SaveVideo(name);
            } else {
                ERR("Can not Find CamId " << nameSt.m_camId);
            }
        } else {
            ERR("Can not Find CamId " << nameSt.m_camId);
            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);
@@ -339,7 +335,9 @@
//保存视频到RtspImageRedis的队列,由RtspCaptureElement调用
bool RtspAnalysManager::SaveImageToRedis(const std::string &camId, const std::string &imageName, const cv::Mat &img) {
    INFO("MYH DEBUG HERE");
    INFO("MYH DEBUG HERE  " << camId);
//    m_imgRedisCRwLock.rdlock();
    auto item = m_imgRedisControllers.find(camId);
    if (item != m_imgRedisControllers.end()) {
        INFO("Save Succeed Cam: " << camId << " ImageKey: " << imageName);
@@ -347,6 +345,7 @@
    } else {
        ERR("Save Failed Cam: " << camId << " ImageKey: " << imageName);
    }
//    m_imgRedisCRwLock.unlock();
    INFO("MYH DEBUG HERE");
    return true;
}
QiaoJiaSystem/VideoToImageMulth/RtspAnalysManager.h
@@ -53,8 +53,12 @@
private:
    RWLock m_imgRedisCRwLock;
    LDBTool *m_lDBTool;
    int m_GB28181_Enable;
    //保存CamID和RtspCaptureElement的映射关系
    std::map<std::string, RtspCaptureElement *> m_controllers;
QiaoJiaSystem/VideoToImageMulth/main.cpp
@@ -45,6 +45,12 @@
    return std::move(str_ip);
}
/***
 * arg1 为-1时启用gb28181
 * @param argc
 * @param argv
 * @return
 */
int main(int argc, char **argv) {
    std::cout << __DATE__ << " " << __TIME__ << std::endl;
    SAVE_APP_ARGS
@@ -53,77 +59,87 @@
    ENABLEGLOG(GET_STR_CONFIG("logPath").c_str());
#endif
    int gindx = atoi(argv[1]) % 2;
    if (argc < 4) {
        assert("t_value.size()");
    }
    int arg1 = atoi(argv[1]);
    int gindx = abs(arg1) % 2;
    int GB28181_Enable = abs(arg1) % 2;
    DBG(gindx);
    appPref.setIntData("GB28181_Enable", GB28181_Enable);
    appPref.setLongData("gpu.index", gindx);
    appPref.setIntData("show.image", 0);
    //todo
    appPref.setIntData("CamStart", atoi(argv[1]));
    appPref.setIntData("CamStart", arg1);
    appPref.setIntData("CamStep", atoi(argv[2]));
    appPref.setIntData("RpcServerPort", atoi(argv[3]));
    if (GB28181_Enable) {
        //#todo search from db
        MysqlDBServerCfg mysqlDBServerCfg;
        mysqlDBServerCfg.Host = getLocalIp();
        mysqlDBServerCfg.Port = 3306;
        mysqlDBServerCfg.UserName = "root";
        mysqlDBServerCfg.Passwd = "123456";
        mysqlDBServerCfg.DBName = "EGEyesForVSS";
        mysqlDBServerCfg.DBConnCount = 5;
    //#todo search from db
    MysqlDBServerCfg mysqlDBServerCfg;
    mysqlDBServerCfg.Host = getLocalIp();
    mysqlDBServerCfg.Port = 3306;
    mysqlDBServerCfg.UserName = "root";
    mysqlDBServerCfg.Passwd = "123456";
    mysqlDBServerCfg.DBName = "EGEyesForVSS";
    mysqlDBServerCfg.DBConnCount = 5;
    LDBTool ldbTool;
    BaseSqliteDao::setLDBTool(&ldbTool);
    //#todo search from db
    Json::Value t_value;
    {
        LDBTool ldbTool;
        BaseSqliteDao::setLDBTool(&ldbTool);
        t_value = VssLocalSettingTblSqliteDao::instance()->findAllVssLocalSettingTblList();
    }
    if (t_value.size() == 1 && t_value["data"].size() > 1) {
        assert("t_value.size()");
    }
    DBG(t_value["data"].begin()->toStyledString());
    auto &t_cfg = *t_value["data"].begin();
    GBServerCfg gbServerCfg;
    gbServerCfg.SvrIp = t_cfg["ServerIp"].asString(); // 国标服务的ip地址  (本机的ip地址)
    gbServerCfg.SvrPort = atoi(t_cfg["ServerPort"].asString().c_str());// 7060; // 国标服务监听的端口
    gbServerCfg.SvrPubID = t_cfg["ServerId"].asString();// "44120000002000000001"; // 国标服务器的ID
    gbServerCfg.bMD5Auth = false; // 是否需要MD5加密
    gbServerCfg.UserName = t_cfg["UserAuthId"].asString();// "44120100002000000002"; // 国标服务的用户名    (下级设备注册的用户名)
    gbServerCfg.Passwd = t_cfg["Password"].asString();// "123456"; // 国标服务的密码    (下级设备注册的密码)
    gbServerCfg.SubScribeTime = 3600; // 订阅时间  如果为0 表示不订阅
    SpinLock spinLock;
    bool running = false;
    bool serinit = false;
    auto func = [&] {
        spinLock.lock();
        GB28181Server m_gbs;
        m_gbs.setMysqlConnParam(mysqlDBServerCfg);
        m_gbs.setGBServerParam(gbServerCfg);
        DBG("initServer start before");
        running = m_gbs.initServer();
        DBG("initServer start after");
        spinLock.unlock();
        while (running) {
            usleep(4000);
        //#todo search from db
        Json::Value t_value;
        {
            LDBTool ldbTool;
            BaseSqliteDao::setLDBTool(&ldbTool);
            t_value = VssLocalSettingTblSqliteDao::instance()->findAllVssLocalSettingTblList();
        }
        if (t_value.size() == 1 && t_value["data"].size() > 1) {
            assert("t_value.size()");
        }
        DBG(t_value["data"].begin()->toStyledString());
        auto &t_cfg = *t_value["data"].begin();
        GBServerCfg gbServerCfg;
        gbServerCfg.SvrIp = t_cfg["ServerIp"].asString(); // 国标服务的ip地址  (本机的ip地址)
        gbServerCfg.SvrPort = atoi(t_cfg["ServerPort"].asString().c_str());// 7060; // 国标服务监听的端口
        gbServerCfg.SvrPubID = t_cfg["ServerId"].asString();// "44120000002000000001"; // 国标服务器的ID
        gbServerCfg.bMD5Auth = false; // 是否需要MD5加密
        gbServerCfg.UserName = t_cfg["UserAuthId"].asString();// "44120100002000000002"; // 国标服务的用户名    (下级设备注册的用户名)
        gbServerCfg.Passwd = t_cfg["Password"].asString();// "123456"; // 国标服务的密码    (下级设备注册的密码)
        gbServerCfg.SubScribeTime = 3600; // 订阅时间  如果为0 表示不订阅
    };
        SpinLock spinLock;
    std::thread thd(func);
        bool running = false;
        bool serinit = false;
        auto func = [&] {
            spinLock.lock();
            GB28181Server m_gbs;
            m_gbs.setMysqlConnParam(mysqlDBServerCfg);
            m_gbs.setGBServerParam(gbServerCfg);
            DBG("initServer start before");
            running = true;
            m_gbs.initServer();
            DBG("initServer start after");
    usleep(400);
    //      ---------------------测试------------------------
    spinLock.lock();
    if (!running) {
        ERR("running is false   <<   DB init error");
        exit(0);
            spinLock.unlock();
            while (running) {
                usleep(4000);
            }
        };
        std::thread thd(func);
        thd.detach();
        usleep(400);
        //      ---------------------测试------------------------
        spinLock.lock();
//    if (!running) {
//        ERR("running is false   <<   DB init error");
//        exit(0);
//    }
    }
    DBG("test start");