video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2020-10-09 529a90df418bd92d206dfeabfb2e1d01b454ad32
h264 mp4
2个文件已修改
47 ■■■■■ 已修改文件
csrc/ffmpeg/format/FormatOut.cpp 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/ffmpeg/format/FormatOut.hpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/ffmpeg/format/FormatOut.cpp
@@ -467,7 +467,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);
@@ -475,34 +475,39 @@
        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);
        }else{
            // returns 1 if flushed and there is no more data to flush
            ret = av_write_frame(ctx, pkt);
        }
        if(ret < -22 || ret == 0){
            return true;
        }
        return false;
    }
    bool FormatOut::writeFrameInternal(AVPacket *pkt, bool interleaved){
        // h264_mp4toanatax
        if (bsf_h264){
            if (av_bsf_send_packet(bsf_h264, pkt) < 0){
                logIt("bsf_h264 send packet failed");
                return true;
            }
            if (av_bsf_receive_packet(bsf_h264, pkt) < 0){
                logIt("bsf_h264 recv packet failed");
                return true;
            int ret;
            while((ret = av_bsf_receive_packet(bsf_h264, pkt)) == 0){
                if (!write_frame(ctx_, pkt, interleaved)) return false;
            }
            if (ret == AVERROR(EAGAIN)) return true;
        }
        //
        int ret = 0;
        if(interleaved){
            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);
        }
        if(ret < -22 || ret == 0){
            return true;
        }
        return false;
        return write_frame(ctx_, pkt, interleaved);
    }
    bool FormatOut::writeTrailer(){
csrc/ffmpeg/format/FormatOut.hpp
@@ -47,7 +47,7 @@
        bool endWriter();
        bool writeHeader(AVDictionary **options = NULL);
        bool writeFrame2(AVPacket *pkt, bool interleaved);
        bool writeFrameInternal(AVPacket *pkt, bool interleaved);
        bool writeTrailer();
    public:
        AVStream *getStream();