video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2021-05-25 470d4180e2b86eee41c9c14910e4131d16edb8b7
csrc/wrapper.cpp
@@ -1,6 +1,7 @@
#include "wrapper.hpp"
#include <thread>
#include <atomic>
#include <unistd.h>
#include <sys/time.h>
@@ -45,6 +46,7 @@
    ,audio_(false)
    ,gb_(0)
    ,cpu_(0)
    ,devid_(-1)
    ,run_dec_(false)
    ,run_stream_(true)
    ,run_rec_(false)
@@ -66,6 +68,7 @@
    ,audio_(false)
    ,gb_(0)
    ,cpu_(0)
    ,devid_(-1)
    ,run_dec_(false)
    ,run_stream_(true)
    ,run_rec_(false)
@@ -108,8 +111,9 @@
        prop.url_ = input;
        prop.rtsp_tcp_ = true;
        prop.gpu_acc_ = !cpu_;
        prop.gpu_index_ = devid_;
       std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl()));
       std::unique_ptr<FormatIn> in(new FormatIn(prop, prop.gpuAccl()));
       int flag = -1;
        if (gb_){
            flag = in->openGb28181(input, NULL);
@@ -450,25 +454,47 @@
        return flag;
    }
    int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){
    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);
        if(retLen == 0){
            logIt("do capturePic failed:%d");
            ret = -1;
        }
        handle_gb28181->deleteCamera();
        return ret;
        t.detach();
        return -1;
    }
}