video analysis2.0拆分,ffmpeg封装go接口库
zhangmeng
2019-11-19 f238d052479dbbe0a8d97e231ff74984bf748903
update
1个文件已修改
82 ■■■■■ 已修改文件
csrc/wrapper.cpp 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
csrc/wrapper.cpp
@@ -504,87 +504,5 @@
        free(c);
    }
// mjpeg av pix fmt yuv420p
    static int save2PIC(uint8_t *data, const int w, const int h, const char *filename){
        AVPixelFormat src_fmt = AV_PIX_FMT_BGR24;
        AVPixelFormat dst_fmt = AV_PIX_FMT_YUV420P;
        cvbridge *bridge = new cvbridge(w, h, src_fmt, w, h, dst_fmt, 16);
        AVFrame *bgr_frame = cvbridge::fillFrame(data, w, h, src_fmt);
        AVFrame *frame_jpeg = bridge->convert2Frame(bgr_frame);
        av_frame_free(&bgr_frame);
        AVFormatContext *ctx = avformat_alloc_context();
        ctx->oformat = av_guess_format("mjpeg", NULL, NULL);
        if( avio_open(&ctx->pb, filename, AVIO_FLAG_READ_WRITE) < 0) {
            printf("Couldn't open output file.");
            avformat_free_context(ctx);
            delete bridge;
            return -1;
        }
        AVStream* pAVStream = avformat_new_stream(ctx, 0);
        if( pAVStream == NULL ){
            delete bridge;
            return -1;
        }
        AVCodecContext* pCodecCtx = pAVStream->codec;
        pCodecCtx->codec_id = ctx->oformat->video_codec;
        pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
        pCodecCtx->pix_fmt = dst_fmt;
        pCodecCtx->width = w;
        pCodecCtx->height = h;
        pCodecCtx->time_base.num = 1;
        pCodecCtx->time_base.den = 25;
        AVCodec* pCodec = avcodec_find_encoder(pCodecCtx->codec_id);
        if( !pCodec ) {
            printf("Codec not found.");
            avformat_free_context(ctx);
            delete bridge;
            return -1;
        }
        if( avcodec_open2(pCodecCtx, pCodec, NULL) < 0 ){
            printf("Could not open codec.");
            avformat_free_context(ctx);
            avio_close(ctx->pb);
            delete bridge;
            return -1;
        }
        avformat_write_header(ctx, NULL);
        int y_size = pCodecCtx->width * pCodecCtx->height;
        AVPacket pkt;
        av_new_packet(&pkt, y_size * 3);
        int got_picture = 0;
        int ret = avcodec_encode_video2(pCodecCtx, &pkt, frame_jpeg, &got_picture);
        av_frame_free(&frame_jpeg);
        delete bridge;
        if( ret < 0 ) {
            printf("Encode Error.\n");
            avformat_free_context(ctx);
            if( pAVStream ) {
                avcodec_close(pAVStream->codec);
            }
            avio_close(ctx->pb);
            return -1;
        }
        if( got_picture == 1 ) {
            pkt.stream_index = pAVStream->index;
            ret = av_write_frame(ctx, &pkt);
            avio_flush(ctx->pb);
        }
        av_free_packet(&pkt);
        //Write Trailer
        av_write_trailer(ctx);
        if( pAVStream ) {
            avcodec_close(pAVStream->codec);
        }
        avio_close(ctx->pb);
        avformat_free_context(ctx);
        return 0;
    }
}