| | |
| | | |
| | | 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_("") |
| | |
| | | {} |
| | | |
| | | 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(){ |
| | |
| | | |
| | | 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()); |
| | |
| | | } |
| | | //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"); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | 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(); |
| | |
| | | |
| | | logIt("min %d max %d endcount %d", minduration, maxduration, end_frame); |
| | | |
| | | thread_.reset(new std::thread([&]{ |
| | | std::thread([&]{ |
| | | run_thread(); |
| | | })); |
| | | }).detach(); |
| | | |
| | | return 0; |
| | | } |
| | |
| | | |
| | | 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(); |