vlc оплачивает видео, созданное с помощью libavcodec, с неправильной частотой кадров

В качестве теста я хотел бы создать видео с частотой кадров 1 кадр/с. Когда я создаю его таким образом, vlc по-прежнему воспроизводит его со скоростью 25 кадров в секунду. у кого-нибудь есть идея?

AVFormatContext* formatContext;
avformat_alloc_output_context2(&formatContext, NULL, NULL, "test.h264");
AVOutputFormat* outputFormat = formatContext->oformat;

AVStream* videoStream = av_new_stream(formatContext, 0);
AVCodecContext* ctx  = videoStream->codec;

ctx->codec_type = AVMEDIA_TYPE_VIDEO;  
ctx->codec_id = CODEC_ID_H264;    

ctx->bit_rate = 500*1000;
ctx->bit_rate_tolerance = 0;
ctx->width = w;
ctx->height = h;
ctx->pix_fmt = AV_PIX_FMT_YUV420P;
ctx->time_base.den = 1;//25;
ctx->time_base.num = 1;

person Jochen    schedule 12.03.2013    source источник
comment
что ffmpeg -i показывает частоту кадров для файла? как насчет влк?   -  person rogerdpack    schedule 12.03.2013


Ответы (1)


это старый вопрос, но я надеюсь, что он поможет другим с той же проблемой

AVStream имеет явный time_base, который устанавливается мультиплексором в соответствии с контейнером. как указано в комментарии AVStream.time_base:

Мультиплексор МОЖЕТ использовать предоставленное пользователем значение AVCodecContext.time_base в качестве подсказки.

вам нужно использовать av_rescale_q(), чтобы установить правильное значение для точек RAW FRAME:

/* AVFrame* */ raw_frame->pts = av_rescale_q(my_pts, ctx->time_base, videoStream->time_base);
.
.
.
/* AVPacket pkt; */
avcodec_encode_video2(ctx, pkt, &got_packet);
.
.
.
av_write_frame(formatContext, &pkt);
person arash kordi    schedule 17.12.2013