video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2022-04-26 ab3d17cd44625a762fc10f0f1fd8f2c46b980aff
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)
@@ -107,13 +110,16 @@
        VideoProp prop;
        prop.url_ = input;
        prop.rtsp_tcp_ = true;
        prop.gpu_acc_ = !cpu_;
        prop.gpu_acc_ = false;
        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;
#ifdef GB28181
        if (gb_){
            flag = in->openGb28181(input, NULL);
        }else{
#endif
           AVDictionary *avdic = prop.optsFormat();
            if(avdic){
                flag = in->open(input, &avdic);
@@ -121,7 +127,9 @@
           }else{
                flag = in->open(input, NULL);
            }
#ifdef GB28181
        }
#endif
       
        if(flag == 0){
            if(!in->findStreamInfo(NULL)){
@@ -450,25 +458,49 @@
        return flag;
    }
    int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){
#ifdef GB28181
    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;
    }
#endif
}