video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2021-05-25 25a151d517f60a76de91095abcbf32a395949825
csrc/wrapper.cpp
@@ -1,6 +1,7 @@
#include "wrapper.hpp"
#include <thread>
#include <atomic>
#include <unistd.h>
#include <sys/time.h>
@@ -455,23 +456,45 @@
    int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen, const int tt){
        int ret = 0;
        std::string fn = rtspUrl;
        std::atomic_bool add_camera{false};
        auto handle_gb28181 = new GB28181API;
        if(handle_gb28181->addCamera(fn) == -1){
            delete(handle_gb28181);
            logIt("do addCamera Error\n");
            return -1;
        std::thread t([&]{
            auto handle_gb28181 = new GB28181API;
            std::string ru(rtspUrl);
            if(handle_gb28181->addCamera(ru) == -1){
                delete(handle_gb28181);
                logIt("do addCamera Error\n");
                ret = -2;
                return;
            }
            add_camera.store(true);
            std::this_thread::sleep_for(std::chrono::seconds(1));
            int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen, tt);
            if(retLen == 0){
                logIt("do capturePic failed:%d");
                ret = -1;
            }
            handle_gb28181->deleteCamera();
            delete handle_gb28181;
        });
        std::this_thread::sleep_for(std::chrono::seconds(1));
        int ttt = tt;
        if (ttt < 6) ttt = 6;
        int i = -1;
        while (true) {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            if (add_camera.load()) {
                t.join();
                return ret;
            }
            if (i++ > ttt) break;
        }
        int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen, tt);
        if(retLen == 0){
            logIt("do capturePic failed:%d");
            ret = -1;
        }
        handle_gb28181->deleteCamera();
        return ret;
        t.detach();
        return -1;
    }
}