From f93ee1a42e8c47e472332287b7350b66a6b0fa11 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 24 七月 2020 18:28:57 +0800 Subject: [PATCH] 保存触发id之后的视频作为触发视频 --- csrc/wrapper.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 89 insertions(+), 16 deletions(-) diff --git a/csrc/wrapper.cpp b/csrc/wrapper.cpp index 19357c5..4964629 100644 --- a/csrc/wrapper.cpp +++ b/csrc/wrapper.cpp @@ -47,6 +47,7 @@ ,cpu_(0) ,run_dec_(false) ,run_stream_(true) + ,run_rec_(false) ,thread_(nullptr) ,stop_stream_(false) ,stream_(nullptr) @@ -54,6 +55,8 @@ ,rec_(new rec) ,logit_(false) ,fps_(25) + ,file_finished_(false) + ,min_duration_(0) { makeTheWorld(); } @@ -65,12 +68,16 @@ ,cpu_(0) ,run_dec_(false) ,run_stream_(true) + ,run_rec_(false) ,thread_(nullptr) ,stop_stream_(false) ,stream_(nullptr) ,decoder_(nullptr) ,rec_(new rec) ,logit_(true) + ,fps_(25) + ,file_finished_(false) + ,min_duration_(0) { makeTheWorld(); logif::CreateLogger(logfile, true); @@ -103,16 +110,19 @@ prop.gpu_acc_ = !cpu_; std::unique_ptr<FormatIn> in(new FormatIn(prop.gpuAccl())); - AVDictionary *avdic = prop.optsFormat(); int flag = -1; if (gb_){ flag = in->openGb28181(input, NULL); }else{ - flag = in->open(input, &avdic); + AVDictionary *avdic = prop.optsFormat(); + if(avdic){ + flag = in->open(input, &avdic); + av_dict_free(&avdic); + }else{ + flag = in->open(input, NULL); + } } - if(avdic){ - av_dict_free(&avdic); - } + if(flag == 0){ if(!in->findStreamInfo(NULL)){ logIt("can't find video stream\n"); @@ -170,7 +180,7 @@ int flag = 0; if (run_stream_ && stream_) stream_->SetPacket(pkt); if (run_dec_ && decoder_) flag = decoder_->SetFrame(pkt); - if (rec_->Loaded()) rec_->SetPacket(pkt); + if (run_rec_ && rec_->Loaded()) rec_->SetPacket(pkt); return flag; } @@ -183,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()); @@ -194,9 +207,12 @@ fps_ = in->getFPS(); - int wTime = 1000000.0 / in->getFPS() ; + if (fps_ < 1 || fps_ > 200){ + fps_ = 25; + } + + int wTime = 1000000.0 / fps_ ; wTime >>= 1; - logIt("WAIT TIME PER FRAME: %d", wTime); init_worker(in.get()); @@ -205,6 +221,12 @@ int64_t a_id = id; bool exist = access(input_url_.c_str(), 0) == 0; + if (exist){ + wTime += wTime/2; + file_rebootime++; + } + + logIt("WAIT TIME PER FRAME: %d", wTime); while(!stop_stream_.load()){ auto data(std::make_shared<CodedData>()); @@ -216,6 +238,7 @@ if (in->notVideoAudio(&data->getAVPacket())){ continue; } + // 闈炲浗鏍囪烦杩囩涓�甯�,娴嬭瘯绗竴甯ф湁闂 if (!gb_ && id < 0){ id++; v_id++; a_id++; @@ -236,21 +259,43 @@ id++; //鏈湴鏂囦欢澶揩sleep涓�涓� - if (exist){ + if (exist && in->isVideoPkt(&data->getAVPacket())){ + // 璁板綍瑙g爜鐨勬枃浠舵湁澶氬皯甯� + file_frame++; usleep(wTime); } } deinit_worker(); - if (exist) break; + if (exist) { + // 涓夋涓�甯ч兘娌¤В鍑烘潵锛岄��鍑� + if (file_frame == 0 && file_rebootime < 3){ + logIt("libcffmpeg.so-> run %lld time, current frames %lld", file_rebootime, file_frame); + continue; + } + // 鏈�灏忛渶瑕佽В鍑哄灏戝抚 + if (file_frame < min_duration_ * fps_){ + logIt("libcffmpeg.so-> run %lld time, current frames %lld, mind %d, fps: %d", + file_rebootime, file_frame, min_duration_, fps_); + continue; + } + logIt("libcffmpeg.so-> local file %s run %lld time, all frames %lld, mind %d, fps: %d", + input_url_.c_str(), file_rebootime, file_frame, min_duration_, fps_); + 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(){ + run_rec_ = true; + } + void Wrapper::BuildRecorder(const char* id, const char *output, const int64_t &fid, const int mindur, const int maxdur, const bool audio){ bool a = audio; if (gb_) a = false; @@ -267,32 +312,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::BuildDecoder(){ + 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_){ + 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 @@ -397,5 +449,26 @@ return flag; } + + int GetGb28181Pic(const char *rtspUrl, char *retData, int *retDataLen){ + int ret = 0; + std::string fn = rtspUrl; + + auto handle_gb28181 = new GB28181API; + if(handle_gb28181->addCamera(fn) == -1){ + delete(handle_gb28181); + logIt("do addCamera Error\n"); + return -1; + } + + int retLen = handle_gb28181->capturePic(handle_gb28181, retData, retDataLen); + if(retLen == 0){ + logIt("do capturePic failed:%d"); + ret = -1; + } + + handle_gb28181->deleteCamera(); + return ret; + } } -- Gitblit v1.8.0