video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-11-29 7363d175bd62697a800a724f91795e87a5c6fd3c
add close push stream
7个文件已修改
37 ■■■■ 已修改文件
cffmpeg.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/cffmpeg.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.cpp 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.hpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gostream.go 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.c 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
libcffmpeg.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cffmpeg.h
@@ -26,6 +26,7 @@
void c_ffmpeg_build_decoder(const cffmpeg h);
void* c_ffmpeg_get_pic_decoder(const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id);
void c_ffmpeg_close_stream(const cffmpeg h);
void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key);
// pic encoder
csrc/cffmpeg.cpp
@@ -102,6 +102,11 @@
    return data;
}
void c_ffmpeg_close_stream(const cffmpeg h){
    Wrapper *s = (Wrapper*)h;
    s->CloseStream();
}
void* c_ffmpeg_get_avpacket(const cffmpeg h, int *size, int *key){
    Wrapper *s = (Wrapper*)h;
    unsigned char *data = NULL;
csrc/wrapper.cpp
@@ -46,6 +46,7 @@
    ,gb_(0)
    ,cpu_(0)
    ,run_dec_(false)
    ,run_stream_(true)
    ,thread_(nullptr)
    ,stop_stream_(false)
    ,stream_(nullptr)
@@ -63,6 +64,7 @@
    ,gb_(0)
    ,cpu_(0)
    ,run_dec_(false)
    ,run_stream_(true)
    ,thread_(nullptr)
    ,stop_stream_(false)
    ,stream_(nullptr)
@@ -150,7 +152,7 @@
        stream_ = new stream(in, 3 * in->getFPS());
        // stream_->AudioSwitch(audio_);
        decoder_ = new decoder(in);
        rec_->Load(in);
@@ -166,8 +168,8 @@
            p.pts = p.dts = AV_NOPTS_VALUE;
        }
        int flag = 0;
        if (stream_) stream_->SetPacket(pkt);
        if (decoder_ && run_dec_) flag = decoder_->SetFrame(pkt);
        if (run_stream_ && stream_) stream_->SetPacket(pkt);
        if (run_dec_ && decoder_) flag = decoder_->SetFrame(pkt);
        if (rec_->Loaded()) rec_->SetPacket(pkt);
        return flag;
@@ -261,7 +263,6 @@
            [=]{rec_->NewRec(rid.c_str(), dir.c_str(), fid, mindur, maxdur, a);};
        }
    }
    int Wrapper::FireRecorder(const char* sid,const int64_t &id){
        if (rec_->Loaded()){
            rec_->FireRecSignal(sid, id);
@@ -284,6 +285,10 @@
        }
    }
    
    void Wrapper::CloseStream(){
        run_stream_ = false;
    }
    void Wrapper::GetPacket(unsigned char **pktData, int *size, int *key){
        if (stream_){
            stream_->GetPacket(pktData, size, key);
csrc/wrapper.hpp
@@ -56,6 +56,7 @@
        void BuildDecoder();
        void GetPicDecoder(unsigned char **data, int *w, int *h, int *format, int *length, int64_t *id);
    public: // push stream
        void CloseStream();
        void GetPacket(unsigned char **pktData, int *size, int *key);
    private:
        // stream 参数
@@ -63,6 +64,7 @@
        bool audio_;
        int gb_, cpu_;
        bool run_dec_;
        bool run_stream_;
        // decoder 参数
        std::unique_ptr<std::thread> thread_;
        std::atomic_bool    stop_stream_;
gostream.go
@@ -8,6 +8,11 @@
import "unsafe"
// CloseStream close stream
func (h *GoFFMPEG) CloseStream() {
    C.wrap_fn_close_stream(unsafe.Pointer(libcffmpeg), h.ffmpeg)
}
//GetAVPacket get AVPacket
func (h *GoFFMPEG) GetAVPacket() ([]byte, int, int) {
    var key C.int
libcffmpeg.c
@@ -135,6 +135,14 @@
    return fn_decoder_pic(h, wid, hei, format, length, id);
}
void wrap_fn_close_stream(void *lib, const cffmpeg h){
    if (!fn_close_stream){
        fn_close_stream = (lib_cffmpeg_close_stream)dlsym(lib, "c_ffmpeg_close_stream");
        if (!fn_close_stream) return;
    }
    fn_close_stream(h);
}
void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key){
    if(!fn_get_avpacket){
        fn_get_avpacket = (lib_cffmpeg_avpacket)dlsym(lib, "c_ffmpeg_get_avpacket");
libcffmpeg.h
@@ -23,6 +23,7 @@
typedef void (*lib_cffmpeg_info_recorder)(const cffmpeg, int*, char**, int*, char**, int*);
typedef void (*lib_cffmpeg_decoder)(const cffmpeg);
typedef void*(*lib_cffmpeg_pic)(const cffmpeg, int*, int*, int*, int*, int64_t*);
typedef void (*lib_cffmpeg_close_stream)(const cffmpeg);
typedef void*(*lib_cffmpeg_avpacket)(const cffmpeg, int*, int*);
static lib_cffmpeg_create              fn_create = NULL;
@@ -38,6 +39,7 @@
static lib_cffmpeg_info_recorder       fn_info_recorder = NULL;
static lib_cffmpeg_decoder             fn_decoder = NULL;
static lib_cffmpeg_pic                 fn_decoder_pic = NULL;
static lib_cffmpeg_close_stream        fn_close_stream = NULL;
static lib_cffmpeg_avpacket            fn_get_avpacket = NULL;
typedef void* libcffmpeg;
@@ -57,6 +59,7 @@
void wrap_fn_info_recorder(void *lib, const cffmpeg, int* index, char** recid, int* recidLen, char** fpath, int* pathLen);
void wrap_fn_decoder(void *lib, const cffmpeg h);
void* wrap_fn_decoder_pic(void *lib, const cffmpeg h, int *wid, int *hei, int *format, int *length, int64_t *id);
void wrap_fn_close_stream(void *lib, const cffmpeg h);
void* wrap_fn_get_avpacket(void *lib, const cffmpeg h, int* size, int* key);
// for encoder
typedef void* cencoder;