1

作为测试,我想创建一个帧速率为 1 fps 的视频。当我像这样创建它时,vlc 仍然以 25 fps 的速度播放。有人有想法吗?

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;
4

1 回答 1

2

这是一个老问题,但我希望它能帮助其他有同样问题的人

AVStream有一个明确time_base的,由 muxer 根据容器设置。如AVStream.time_base评论中所述:

复用器可以使用用户提供的值 AVCodecContext.time_base作为提示。

您需要使用av_rescale_q()RAW FRAME pts 设置为正确的值:

/* 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);
于 2013-12-17T11:22:50.727 回答