[Libav-user] Idiomatic way to set encoding codec options for a stream

Strahinja Radman dr.strashni at gmail.com
Thu Feb 13 17:01:28 EET 2020

> If I understand correctly, the AVCodecContext is instantiated separately
> from the FormatContext and Streams.
> So what I have to do is:
> 1- Instanciate the codec context and configure it as you suggested
> 2- Instanciate an AVFormatContext
> 3- Add a stream without codec using avformat_new_stream(fmt_ctx, NULL)
> 4- set stream id and update codecpar using avcodec_parameters_from_context
> 5- generate the format header with avformat_write_header
> 6- proceed to the frame encoding loop
> right?

There is a transcoding.c example on FFmpeg's github repo. But in essence you
create new AVFormatContext first using the

  avformat_alloc_output_context2(ofmt_ctx, NULL, NULL, ofn.c_str());

After that you add streams, as much as you need or as much as your
supports using the

   out_stream = avformat_new_stream(ofmt_ctx, NULL);

Once you have your stream then you open the appropriate encoder for data
you want to encode

      encoder = avcodec_find_encoder(AV_CODEC_ID_H264);

and based on returned value you create your AVCodecContext with

    enc_ctx = avcodec_alloc_context3(encoder);

You set required options using the

     av_opt_set_double(enc_ctx->priv_data, "crf", 23.00, 0);

and then simply open the AVCodecContext calling the

    ret = avcodec_open2(enc_ctx, encoder, NULL);

You then copy encoder properties to the streams AVCodecParameters

    ret = avcodec_parameters_from_context(out_stream->codecpar, enc_ctx);

open the file and write header.
    ret = avio_open(ofmt_ctx->pb, ofn.c_str(), AVIO_FLAG_WRITE);
    ret = avformat_write_header(ofmt_ctx, NULL);


Strahinja Radman
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20200213/215b405b/attachment.html>

More information about the Libav-user mailing list