video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2020-10-09 a8b447be656145c9ba2a2d8319a10ae8f726de1f
csrc/ffmpeg/format/FormatOut.cpp
@@ -38,6 +38,7 @@
   FormatOut::~FormatOut()
   {
      clear();
   }
    void FormatOut::clear(){
@@ -349,7 +350,7 @@
            flag = writeHeader(&avdic);
            av_dict_free(&avdic);
        }
        return flag;
    }
    
@@ -399,7 +400,7 @@
        int out_idx = -1;
        std::vector<AVStream*> in_streams{in_v_stream_, in_a_stream_};
        for (auto i : in_streams){
            if (i->index == pkt->stream_index){
            if (i && (i->index == pkt->stream_index)){
                if (i->codecpar->codec_type == AVMEDIA_TYPE_VIDEO){
                    out_idx = v_idx_;
                    in_stream = i;
@@ -446,7 +447,7 @@
                              bool interleaved/* = true*/){
        adjustPTS(pkt, frame_cnt);
        auto ret = writeFrame2(pkt, interleaved);
        auto ret = writeFrameInternal(pkt, interleaved);
        if (!ret){
            logIt("write to file failed, pkt.pts: %lld, dts: %lld, frame count: %d",
                    pkt->pts, pkt->dts, frame_cnt);
@@ -454,16 +455,15 @@
        return ret;
    }
    bool FormatOut::writeFrame2(AVPacket *pkt, bool interleaved){
    static bool write_frame(AVFormatContext *ctx, AVPacket *pkt, bool interleaved){
        int ret = 0;
        if(interleaved){
            ret = av_interleaved_write_frame(ctx_, pkt);
            ret = av_interleaved_write_frame(ctx, pkt);
        }else{
            // returns 1 if flushed and there is no more data to flush
            ret = av_write_frame(ctx_, pkt);
            ret = av_write_frame(ctx, pkt);
        }
        if(ret < -22 || ret == 0){
            return true;
        }
@@ -471,6 +471,11 @@
        return false;
    }
    bool FormatOut::writeFrameInternal(AVPacket *pkt, bool interleaved){
        return write_frame(ctx_, pkt, interleaved);
    }
    bool FormatOut::writeTrailer(){
        const int ret = av_write_trailer(ctx_);
        if(ret != 0)