video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-10-10 cd3fe8cc1ae9028acb4f630ed16c12f4fb327f3c
csrc/worker/rec.cpp
@@ -3,6 +3,10 @@
#include <unistd.h>
#include <sys/time.h>
extern "C"{
#include <libavcodec/avcodec.h>
}
#include "../ffmpeg/format/FormatIn.hpp"
#include "../ffmpeg/data/CodedData.hpp"
#include "../ffmpeg/log/log.hpp"
@@ -40,7 +44,7 @@
        list_recInfo_.emplace_back(info);
    }
    std::unique_ptr<buz::Recorder> rec::startRec(std::string id, std::string dir, const int mind, const int maxd){
    std::unique_ptr<buz::Recorder> rec::startRec(std::string id, std::string dir, const int mind, const int maxd, const bool audio){
        if(!recRef_){
            logIt("Init wrapper first");
            return nullptr;
@@ -54,7 +58,7 @@
        int trycnt = 0;
        while(trycnt < 100){
            auto ret = rec->Run(dir.c_str(), mind, maxd);
            auto ret = rec->Run(dir.c_str(), mind, maxd, audio);
            if(ret == 0) break;
            usleep(200000);
        }
@@ -133,19 +137,19 @@
        return recRef_ != NULL;
    }
    
    void rec::NewRec(const char* id, const char *output, const int mindur, const int maxdur){
    void rec::NewRec(const char* id, const char *output, const int mindur, const int maxdur, const bool audio){
        std::string rid(id);
        std::string dir(output);
        
        minduration_ = mindur * 25;
        maxduration_ = maxdur * 25;
        minduration_ = mindur * recRef_->getFPS();
        maxduration_ = maxdur * recRef_->getFPS();
        {
            std::lock_guard<std::mutex> l(mtx_rec_);
            if (map_rec_.find(rid) != map_rec_.end()){
                map_rec_.erase(rid);
            }
            map_rec_[rid] = startRec(rid, dir, mindur, maxdur);
            map_rec_[rid] = startRec(rid, dir, mindur, maxdur, audio);
        }
        
    }
@@ -181,12 +185,14 @@
        std::lock_guard<std::mutex> l(mtx_pkt_);
        //wait I 
        if (list_pkt_.empty()) {
            AVPacket &avpkt = data->getAVPacket();
            if (!(avpkt.flags & AV_PKT_FLAG_KEY)){
            if (!(data->getAVPacket().flags & AV_PKT_FLAG_KEY)){
                return;
            }
        }
        list_pkt_.push_back({data, id});
        // 超过缓存最大长度,删除一个gop
        shrinkCache();
    }
@@ -194,12 +200,12 @@
    int rec::shrinkCache(){
        //超过最大缓存,丢弃gop
        //缓存最小长度的,用于记录
        while (list_pkt_.size() > minduration_/2) {
        int md = minduration_ < 201 ? 200 : minduration_;
        while (list_pkt_.size() > md/2) {
            list_pkt_.pop_front();
            while(!list_pkt_.empty()){
                auto &cache = list_pkt_.front();
                AVPacket &avpkt = cache.data->getAVPacket();
                if (!(avpkt.flags & AV_PKT_FLAG_KEY)){
                auto &i = list_pkt_.front();
                if (!(i.data->getAVPacket().flags & AV_PKT_FLAG_KEY)){
                    list_pkt_.pop_front();
                }else{
                    break;