FFMPEG-C API-GIF创建

问题描述 投票:0回答:1

[我有一个图像处理管道,并且我的内存中有图像,将其转换为AVFrame,然后尝试使用这些图像创建GIF。

[我从topic开始,只是将视频图像解码器部分替换为内存中的图像到AVFrame

效果很好,但是我对GIF帧速率有疑问。

进入init_filters(...)方法,我不理解参数结构的time_basepixel_aspect变量:

    snprintf(args, sizeof(args),
         "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
         width, height, in_fmt, time_base.num, time_base.den,
         pixel_aspect.num, pixel_aspect.den);

我希望将FPS设置为12,所以我应该按照以下定义它们吗?

AVRational time_base = AVRational{1, 12};
AVRational pixel_aspect= AVRational{1, 1}; 

接下来,在将帧馈送到过滤器缓冲区(对于palettegen)的循环中,我还有一个我不理解的选项,AVFrame-> pts是指什么?

    // palettegen need a whole stream, just add frame to buffer.
    ret = av_buffersrc_add_frame_flags(buffersrc_ctx, picture_rgb24, AV_BUFFERSRC_FLAG_KEEP_REF);
    if (ret < 0) {
        av_log(nullptr, AV_LOG_ERROR, "error add frame to buffer source %s\n", av_make_error_string(msg_v2, MSG_LEN, ret));
    }

    picture_rgb24->pts += 1; // HERE

据我了解,它应该是帧的时间戳,就我而言,我有一个GIF,是否应该每次加1?或1000ms / 12帧= 83.33 ms?我不确定,我试图找到信息,但到目前为止还没有运气。

还有init_muxer(...)方法可以设置输出(GIF)的time_base:

    o_codec_ctx->time_base = AVRational{1, 12};

所以我对所有必须设置帧速率的地方感到困惑。

现在,使用FFMPEG C API在内存中很好地生成了GIF(使用调色板),唯一的问题是GIF太快了,并且帧速率不正确。

c ffmpeg gif
1个回答
0
投票

最后,我找到了。您必须基于帧速率(12)和编解码器time_base(对于GIF为1/100)来增加视频点数。

picture_rgb24->pts += av_rescale_q(1, { 1, 12 }, { 1, 100 });
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.