video analysis2.0拆分,ffmpeg封装go接口库
chenshijun
2019-07-29 d2bec7c45f71a12734b359f10bda6302ecd8a657
csrc/buz/recorder.cpp
@@ -17,15 +17,15 @@
namespace cffmpeg_wrap{
    namespace buz{
        Recorder::Recorder(FormatIn *in)
        Recorder::Recorder(FormatIn *in, const std::string &id)
        :in_(in)
        ,out_(NULL)
        ,maxduration(30 * 25)
        ,minduration(10 * 25)
        ,end_frame(minduration)
        ,cur_frame(-1)
        ,thread_(nullptr)
        ,stop_recorder_(false)
        ,id_(id)
        ,id_frame_(0)
        ,file_frame_index_(-1)
        ,file_path_("")
@@ -33,13 +33,8 @@
        {}
        Recorder::~Recorder(){
            if(thread_){
                stop_recorder_.store(true);
                cv_.notify_one();
                thread_->join();
            }
            if(out_)
                delete out_;
            stop_recorder_.store(true);
            cv_.notify_one();
        }
        int Recorder::init_writer(){
@@ -59,6 +54,7 @@
        void Recorder::start_writer(){
            if (cur_frame == 0) {
                srandom(time(NULL));
                file_path_ = dir_ + "/" + std::to_string(random()) + ".mp4";
                out_->JustWriter(in_->getStream(), file_path_.c_str());
                logIt("start record %s", file_path_.c_str());
@@ -95,7 +91,10 @@
            }
            //callback to frame index and path
            if(func_rec_info_){
                func_rec_info_(file_frame_index_, file_path_);
                func_rec_info_(id_,file_frame_index_, file_path_);
                // logIt("recoder index %d, file name %s\n", file_frame_index_, file_path_.c_str());
            }else{
                // logIt("recorder has no func_rec_info");
            }
        }
@@ -144,13 +143,13 @@
                    }
                }
            }
            if (out_){
                delete out_;
                out_ = NULL;
            }
        }
        int Recorder::Run(const char* output, const int mind, const int maxd){
            if(thread_){
                logIt("recorder already run");
                return 0;
            }
            dir_ = output;
            int ret = init_writer();
@@ -168,9 +167,9 @@
            logIt("min %d max %d endcount %d", minduration, maxduration, end_frame);    
            thread_.reset(new std::thread([&]{
            std::thread([&]{
                run_thread();
            }));
            }).detach();
            return 0;
        }
@@ -222,7 +221,7 @@
        void Recorder::maybe_dump_gop(){
            //超过min/2,丢弃gop
            while (list_pkt_.size() > minduration /2) {
            while (list_pkt_.size() > maxduration) {
                list_pkt_.pop_front();
                while(!list_pkt_.empty()){
                    auto &cache = list_pkt_.front();