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)){
@@ -222,7 +230,7 @@
            bool exist = access(input_url_.c_str(), 0) == 0;
            if (exist){
                wTime <<= 1;
                wTime += wTime/2;
                file_rebootime++;
            }
@@ -233,10 +241,6 @@
                if (in->readPacket(&data->getAVPacket()) != 0){
                    logIt("read packet error, id: %lld", id);
                    break;
                }
                if (exist){
                    // 记录解码的文件有多少帧
                    file_frame++;
                }
                // 非音视频
                if (in->notVideoAudio(&data->getAVPacket())){
@@ -263,7 +267,9 @@
                id++;
                //本地文件太快sleep一下
                if (exist){
                if (exist && in->isVideoPkt(&data->getAVPacket())){
                    // 记录解码的文件有多少帧
                    file_frame++;
                    usleep(wTime);
                }
@@ -452,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
}