2

I am studying about ffmpeg in c++ to see example of ffmpeg

but I dont' know how to solve this problem in transcoding.c

here is my problem

enter image description here

and here is code

static int open_output_file(const char *filename)
{

    AVCodecContext *dec_ctx, *enc_ctx;
    AVCodec *encoder;
    AVStream *in_stream, *out_stream;
    int ret;
    unsigned int i;
    ofmt_ctx = NULL;

    avformat_alloc_output_context2(&ofmt_ctx, NULL, NULL, filename);

    if (!ofmt_ctx) {
        av_log(NULL, AV_LOG_ERROR, "Could not create output context\n");
        return AVERROR_UNKNOWN;
    }



    for (i = 0; i < ifmt_ctx->nb_streams; i++) {

        in_stream = ifmt_ctx->streams[i];
        out_stream = avformat_new_stream(ofmt_ctx,NULL);


        if (!out_stream) {
            av_log(NULL, AV_LOG_ERROR, "Failed allocating output stream\n");
            return AVERROR_UNKNOWN;
        }


            dec_ctx = in_stream->codec;
            enc_ctx = out_stream->codec;


        printf("codec name : %s \n", avcodec_get_name(enc_ctx->codec_id));



        if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO || dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
            /* in this example, we choose transcoding to same codec */

            encoder = avcodec_find_encoder(dec_ctx->codec_id);

            if (!encoder) {
                av_log(NULL, AV_LOG_FATAL, "Necessary encoder not found\n");
                return AVERROR_INVALIDDATA;
            }

            /* In this example, we transcode to same properties (picture size,
            * sample rate etc.). These properties can be changed for output
            * streams easily using filters */
            if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {

                enc_ctx->height = dec_ctx->height;
                enc_ctx->width = dec_ctx->width;



                enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio;


                /* take first format from list of supported formats */
                enc_ctx->pix_fmt = encoder->pix_fmts[0];

                /* video time_base can be set to whatever is handy and supported by encoder */
                enc_ctx->time_base = dec_ctx->time_base;
            }

            else {
                enc_ctx->sample_rate = dec_ctx->sample_rate;
                enc_ctx->channel_layout = dec_ctx->channel_layout;
                enc_ctx->channels = av_get_channel_layout_nb_channels(enc_ctx->channel_layout);

                /* take first format from list of supported formats */
                enc_ctx->sample_fmt = encoder->sample_fmts[0];
                enc_ctx->time_base.num = 1;
                enc_ctx->time_base.den = enc_ctx->sample_rate;
            }



            /* Third parameter can be used to pass settings to encoder */
            ret = avcodec_open2(enc_ctx, encoder, NULL);

            if (ret < 0) {
                cout << "ret<0" << endl;
                av_log(NULL, AV_LOG_ERROR, "Cannot open video encoder for stream #%u\n", i);
                return ret;
            }
        }
        else if (dec_ctx->codec_type == AVMEDIA_TYPE_UNKNOWN) {
            av_log(NULL, AV_LOG_FATAL, "Elementary stream #%d is of unknown type, cannot proceed\n", i);
            return AVERROR_INVALIDDATA;
        }

        else {
            /* if this stream must be remuxed */
            ret = avcodec_copy_context(ofmt_ctx->streams[i]->codec,
                ifmt_ctx->streams[i]->codec);
            if (ret < 0) {
                av_log(NULL, AV_LOG_ERROR, "Copying stream context failed\n");
                return ret;
            }
        }

        if (ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
            enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;

    }

    av_dump_format(ofmt_ctx, 0, filename, 1);

    if (!(ofmt_ctx->oformat->flags & AVFMT_NOFILE)) {
        ret = avio_open(&ofmt_ctx->pb, filename, AVIO_FLAG_WRITE);
        if (ret < 0) {
            av_log(NULL, AV_LOG_ERROR, "Could not open output file '%s'", filename);
            return ret;
        }
    }
    /* init muxer, write output file header */
    ret = avformat_write_header(ofmt_ctx, NULL);
    if (ret < 0) {
        av_log(NULL, AV_LOG_ERROR, "Error occurred when opening output file\n");
        return ret;
    }
    return 0;

}

I found this problem in open_output_file function....

but I can't fix this problem..

how I can approach this problem..

I need your help,.

2
  • can you try to add add "-vpre hq" or "-vpre max" to the advanced command options. And if it works add it to your preset. Commented Jul 13, 2015 at 10:15
  • how do you do his programmatically ? Commented Jan 22, 2016 at 23:43

1 Answer 1

1

add this after if (dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {

enc_ctx->qmin = 3;
enc_ctx->qmax = 30;
enc_ctx->qcompress = 1;

It helps me.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.