[Libav-user] Erratic encoding issue: Crazy framerates.

Talgorn François-Xavier fxtalgorn at yahoo.fr
Thu Sep 3 19:26:47 CEST 2015

I don't know if this is right but this is how I rescale timestamps:
 //Back to yuv for encoding flattened image
                yuv_pix->av_frame=RGBtoYUV(rgb_pix->av_frame, in_stream->codec);

                avcodec_encode_video2(out_stream->codec, &styl_pkt, yuv_pix->av_frame, &got_something);
                    INFO(stderr, ":-( Unable to encode yuv frame.\n");
                //convert timestamps from in time_base to out time_base
                av_packet_rescale_ts(&styl_pkt, in_stream->time_base, out_stream->time_base);

                //log_packet(in_video_ctx->format_ctx, &orig_pkt, "Video orig. pkt");
                //log_packet(out_video_ctx->format_ctx, &styl_pkt, "Video styl. pkt");
                ret = av_write_frame(out_video_ctx->format_ctx, &styl_pkt);
                if (ret < 0)
                    INFO(stderr, "Error muxing packet\n");

I'm sure I'm wrong somewhere with this timestamps management but I can't figure out how.
Thanks again if you can help me further!

Le 3 sept. 2015 à 18:23, Robert Krüger <krueger at lesspain.de> a écrit :

> On Thu, Sep 3, 2015 at 5:41 PM, Talgorn François-Xavier <fxtalgorn-at-yahoo.fr at ffmpeg.org> wrote:
> Hi Krueger,
> Thanks for your reply.
> I did check the timestamps and durations of packets.
> It appears that respectives timestamps (original/encoded) are in different formats but consistent (incremental).
> I set the timebase for encoded file to the same as the original (in_ctx->format_ctx is the original context).
>     o_codec_ctx->time_base.num = in_ctx->format_ctx->streams[in_ctx->video_stream_idx]->codec->time_base;
>     o_codec_ctx->time_base.den = in_ctx->format_ctx->streams[in_ctx->video_stream_idx]->codec->time_base;
> I don't know if this is OK to duplicate a timebase from H264 to be used in a MP4 context.
> Since it defines the frame rate only (not the ticks/frame) it should OK I guess.
> no, it does not. mov/mp4 don't have a concept like frame rate.
> The encoder gives you packets that have timestamps that are based on what you gave the encoder as timebase. The muxer has the freedom to change that timebase in avformat_write_header and if it does, the packets you get from the encoder have incorrect timestamps, if you don't rescale them to the timebase of the AVStream modified by the muxer. Check the example muxing.c in the docs. You have to do what's done there (see line 83). If you don't, what you describe (incorrect frame rate) may very well be the result. 
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20150903/c035428f/attachment.html>

More information about the Libav-user mailing list