video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-09-27 762251329bca80422a8e65d0cdb36e86e84883cf
bug fix
7个文件已修改
134 ■■■■ 已修改文件
csrc/buz/recorder.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/cffmpeg.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/ffmpeg/format/FormatIn.cpp 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/ffmpeg/format/FormatIn.hpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/ffmpeg/format/FormatOut.cpp 99 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/ffmpeg/format/FormatOut.hpp 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
goffmpeg.go 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/buz/recorder.cpp
@@ -74,7 +74,7 @@
            
            int pid = getpid();
            file_path_ = dir_ + "/" + sole::uuid4().base62() + "-" + std::to_string(pid) + ".mp4";
            auto ret = out_->JustWriter(in_->allStreams(), file_path_.c_str());
            auto ret = out_->JustWriter(in_->getStream(AVMEDIA_TYPE_VIDEO), in_->getStream(AVMEDIA_TYPE_AUDIO), file_path_.c_str());
            if (ret){
                logIt("start record file: %s", file_path_.c_str());
                return 0;
csrc/cffmpeg.cpp
@@ -19,7 +19,7 @@
cffmpeg c_ffmpeg_create(const int log, const char *logfile){
    bool logit = false;
    if (log) logit = true;
    if (log != 0) logit = true;
    return new Wrapper(logit, logfile);
}
csrc/ffmpeg/format/FormatIn.cpp
@@ -274,19 +274,6 @@
        return NULL;
    }
    std::vector<AVStream*> FormatIn::allStreams(){
        std::vector<AVStream*> vec;
        auto v = getStream(AVMEDIA_TYPE_VIDEO);
        if (v){
            vec.push_back(v);
        }
        auto a = getStream(AVMEDIA_TYPE_AUDIO);
        if (a){
            vec.push_back(a);
        }
        return vec;
    }
    AVCodecContext *FormatIn::getCodecContext(int type){
        return dec_ctx_;
    }
csrc/ffmpeg/format/FormatIn.hpp
@@ -3,7 +3,6 @@
#include <stdint.h>
#include <memory>
#include <vector>
#include "PsToEs.hpp"
struct AVFormatContext;
@@ -47,7 +46,6 @@
        bool allocCodec(AVCodec *dec, AVStream *s, AVDictionary **options);
    public:
        AVStream *getStream(int type = -1);
        std::vector<AVStream*> allStreams();
        AVCodecContext *getCodecContext(int type = 0);
        AVFormatContext *getFromatContext(){return ctx_;}
        const double getFPS()const{return fps_;}
csrc/ffmpeg/format/FormatOut.cpp
@@ -31,6 +31,8 @@
    ,record_(false)
    ,fps_(0.0f)
    ,format_name_("mp4")
    ,in_v_stream_(NULL)
    ,in_a_stream_(NULL)
    {}
    FormatOut::~FormatOut()
@@ -275,61 +277,63 @@
        return true;
    }
    bool FormatOut::copyCodecFromIn(std::vector<AVStream*> in){
        for (int i = 0; i < in.size(); i++){
            AVStream *in_stream = in[i];
            AVStream *out_stream = avformat_new_stream(ctx_, in_stream->codec->codec);
            if(!out_stream)
            {
                logIt("Failed allocating output stream.\n");
                return false;
            }
            //将输出流的编码信息复制到输入流
            auto ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
            if(ret<0)
            {
                logIt("Failed to copy context from input to output stream codec context\n");
                return false;
            }
            if (in_stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
                v_idx_ = i;
                logIt("copy video from instream");
                out_stream->codecpar->codec_tag = out_stream->codec->codec_tag = 0;
                if(ctx_->oformat->flags & AVFMT_GLOBALHEADER)
                    out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
            }
            if (in_stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO){
                logIt("copy audio from instream");
                a_idx_ = i;
                out_stream->codecpar->codec_tag = out_stream->codec->codec_tag = 0;
                if(ctx_->oformat->flags & AVFMT_GLOBALHEADER)
                    out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
            }
    bool FormatOut::addStream(AVStream *s){
        AVStream *in_stream = s;
        AVStream *out_stream = avformat_new_stream(ctx_, in_stream->codec->codec);
        if(!out_stream)
        {
            logIt("Failed allocating output stream.\n");
            return false;
        }
        in_streams_ = in;
        //将输出流的编码信息复制到输入流
        auto ret = avcodec_copy_context(out_stream->codec, in_stream->codec);
        if(ret<0)
        {
            logIt("Failed to copy context from input to output stream codec context\n");
            return false;
        }
        out_stream->codecpar->codec_tag = out_stream->codec->codec_tag = 0;
        if(ctx_->oformat->flags & AVFMT_GLOBALHEADER)
            out_stream->codec->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
        return true;
    }
    bool FormatOut::JustWriter(std::vector<AVStream*> in, const char *filename){
    bool FormatOut::copyCodecFromIn(AVStream *v, AVStream *a){
        if (v){
            v_idx_ = 0;
            in_v_stream_ = v;
            if (!addStream(v)){
                logIt("format out add video stream error");
                return false;
            }else{
                logIt("copy video from instream");
            }
        }
        if (a){
            a_idx_ = 1;
            in_a_stream_ = a;
            if (!addStream(a)){
                logIt("format out add audio stream error");
                return false;
            }else{
                logIt("copy audio from instream");
            }
        }
        return true;
    }
    bool FormatOut::JustWriter(AVStream *v, AVStream *a, const char *filename){
        if(ctx_){
            clear();
        }
        bool flag = open(NULL, format_name_.c_str());
        flag = copyCodecFromIn(in) && flag;
        flag = copyCodecFromIn(v, a) && flag;
        if(!flag){
            logIt("FormatOut JustWriter error from in");
            return false;
@@ -396,7 +400,7 @@
            return;
        }
        
        if (pkt->pts == AV_NOPTS_VALUE && pkt->pts == AV_NOPTS_VALUE){
        if (!in_a_stream_){
            int64_t time_stamp = frame_cnt;
        
            pkt->pos = -1;  
@@ -417,7 +421,8 @@
        AVStream *in_stream,*out_stream;
        int out_idx = -1;
        for (auto i : in_streams_){
        std::vector<AVStream*> in_streams{in_v_stream_, in_a_stream_};
        for (auto i : in_streams){
            if (i->index == pkt->stream_index){
                if (i->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
                    out_idx = v_idx_;
csrc/ffmpeg/format/FormatOut.hpp
@@ -4,7 +4,6 @@
#include <stdlib.h>
#include <memory>
#include <string>
#include <vector>
struct AVFormatContext;
struct AVStream;
@@ -35,11 +34,12 @@
        int encode(AVPacket *pkt, AVFrame *frame);
    public:
        bool copyCodecFromIn(std::vector<AVStream*> in);
        bool addStream(AVStream *s);
        bool copyCodecFromIn(AVStream *v, AVStream *a);
        bool openResource(const char *filename, const int flags);
        bool closeResource();
        bool JustWriter(std::vector<AVStream*> in, const char *filename);
        bool JustWriter(AVStream *v, AVStream *a, const char *filename);
        bool EncodeWriter(const char *filename);
        bool writeFrame(AVPacket *pkt, const int64_t &frame_cnt, bool interleaved = true);
        void adjustPTS(AVPacket *pkt, const int64_t &frame_cnt);
@@ -73,7 +73,8 @@
        std::string             format_name_;
        // rec
        std::vector<AVStream*>  in_streams_;
        AVStream                  *in_v_stream_;
        AVStream                  *in_a_stream_;
    };
}
#endif
goffmpeg.go
@@ -77,7 +77,9 @@
func New(conf Config) *GoFFMPEG {
    var l *C.char
    f := C.wrap_fn_create(0, l)
    logit := 0
    f := C.wrap_fn_create(C.int(logit), l)
    if f == nil {
        return nil
@@ -102,7 +104,8 @@
    lf := C.CString(logfile)
    defer C.free(unsafe.Pointer(lf))
    f := C.wrap_fn_create(1, lf)
    logit := 1
    f := C.wrap_fn_create(C.int(logit), lf)
    if f == nil {
        return nil
    }