video analysis2.0拆分,ffmpeg封装go接口库
554325746@qq.com
2020-03-11 62a465253c96a666a8dfbf099a45aeaae6c975bd
csrc/wrapper.cpp
@@ -56,6 +56,7 @@
    ,logit_(false)
    ,fps_(25)
    ,file_finished_(false)
    ,min_duration_(0)
    {
        makeTheWorld();
    }
@@ -76,6 +77,7 @@
    ,logit_(true)
    ,fps_(25)
    ,file_finished_(false)
    ,min_duration_(0)
    {
        makeTheWorld();
        logif::CreateLogger(logfile, true);
@@ -191,6 +193,9 @@
    void Wrapper::run_stream_thread(){
        
        int64_t file_rebootime = 0;
        int64_t file_frame = 0;
        while(!stop_stream_.load()){
            auto in = init_reader(input_url_.c_str());
            
@@ -218,6 +223,7 @@
            bool exist = access(input_url_.c_str(), 0) == 0;
            if (exist){
                wTime <<= 1;
                file_rebootime++;
            }
            logIt("WAIT TIME PER FRAME: %d", wTime);
@@ -232,6 +238,7 @@
                if (in->notVideoAudio(&data->getAVPacket())){
                    continue;
                }
                // 非国标跳过第一帧,测试第一帧有问题
                if (!gb_ && id < 0){
                    id++; v_id++; a_id++;
@@ -254,21 +261,31 @@
                //本地文件太快sleep一下
                if (exist){
                    usleep(wTime);
                    // 记录解码的文件有多少帧
                    file_frame++;
                }
            }
            deinit_worker();
            if (exist) {
                logIt("local file exist");
                // 三次一帧都没解出来,退出
                if (file_frame == 0 && file_rebootime < 3){
                    continue;
                }
                // 最小需要解出多少帧
                if (file_frame < min_duration_ * fps_){
                    continue;
                }
                logIt("libcffmpeg.so-> local file %s run %lld time, all frames %lld", input_url_.c_str(), file_rebootime, file_frame);
                file_finished_ = true;
                break;
            }
        }
    }
    void Wrapper::SetRecMinCacheTime(const int mind){
        rec_->SetRecMinCacheTime(mind);
    void Wrapper::SetRecMinCacheTime(const int mind, const int maxd){
        min_duration_ = mind;
    }
    void Wrapper::OpenRecorder(){
@@ -291,41 +308,39 @@
        if (rec_->Loaded()){
            rec_->FireRecSignal(sid, id);
        }
        return 0;
    }
    void Wrapper::GetInfoRecorder(std::string &recID, int &index, std::string &path){
    int Wrapper::GetInfoRecorder(std::string &recID, int &index, std::string &path){
        if (rec_){
            rec_->GetRecInfo(recID, index, path);
        }
        return 0;
    }
    ////////decoder
    void Wrapper::OpenDecoder(){
        run_dec_ = true;
    }
    void Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){
    int Wrapper::GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id){
        if (file_finished_){
            *data = (unsigned char*)this;
            *w = 1080;
            *h = 720;
            *format = 23;
            *length = 12;
            *id = -10802020;
            return;
            return -1;
        }
        if (decoder_){
            decoder_->GetFrame(data, w, h, format, length, id);
        }
        return 0;
    }
    
    void Wrapper::CloseStream(){
        run_stream_ = false;
    }
    void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){
    int Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){
        if (stream_){
            stream_->GetPacket(pktData, size, key);
        }
        return 0;
    }
} // end class wrapper