[Libav-user] How to corretly setting container and stream information when using an external encoder and using libavformat to pack the movie container

Carl Eugen Hoyos ceffmpeg at gmail.com
Sat Oct 26 22:10:10 EEST 2019

Am Sa., 26. Okt. 2019 um 20:57 Uhr schrieb Ingmar Rieger <dev at irieger.net>:
> On 26.10.19 14:37, Carl Eugen Hoyos wrote:
> > Am Sa., 26. Okt. 2019 um 14:14 Uhr schrieb Ingmar Rieger <dev at irieger.net>:
> >
> >> On 26.10.19 10:59, Carl Eugen Hoyos wrote:

> >> So basically I have an input like frame_rate (in integer for simplicity,
> >> don't care about the crazy 23.98 and other strange rates), a frame
> >> number from 0 to NUM_FRAMES-1 and ideally a start time input -> How to
> >> set the correct time base/rates and calculate the frame dts/pts?
> >
> > As said, you cannot set the time base (you can but you don't have to) but
> > you have to read the time base used by the muxer, then calculate timestamps
> > using this time base, should be possible with av_rescale_q().
> Ok, so what do I set and what will be set automatically in general?
> As I said I found no documentation describing how to setup a stream
> manually, that is why I asked in the first place. Just used the remux
> example (which uses avcodec_parameters_copy) as the base and manually
> read information from an existing Cineform encoded by Blackmagic to set
> the parameters manually.

There is also a transcoding example in doc/examples and there is a lot
of documentation in libavformat/avformat.h.

> With
>  > out_avstream->avg_frame_rate = (AVRational){24, 1};
>  > out_avstream->r_frame_rate   = out_avstream->avg_frame_rate;
> I now have to correct frame rate shown when av_dump_format is called but
> after writing some frames the frame rate seems to be reset.
> My current code that tries to set correct pts/dts values:
>  > AVRational timebase_clip  = out_avstream->time_base;

This looks reasonable.

>  > AVRational timebase_count = (AVRational){1, 24}; // also tried {24, 1}

Don't know.

>  > pkg.pts  = av_rescale_q(frame, timebase_count, timebase_clip);

Probably av_packet_rescale_ts()

>  > pkg.dts  = pkg.dts;

This looks wrong.

Carl Eugen

More information about the Libav-user mailing list