gpt4 book ai didi

c - FFMPEG - C API - GIF 创建

转载 作者:行者123 更新时间:2023-12-04 22:58:38 25 4
gpt4 key购买 nike

我有一个图像处理管道,我在内存中有图像,可以转换为 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 吗?还是 1000 毫秒/12 帧 = 83.33 毫秒?我不确定,我试图找到信息,但到目前为止还没有运气。

还有 init_muxer(...)可以设置输出 (GIF) 的 time_base 的方法:
    o_codec_ctx->time_base = AVRational{1, 12};

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

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

最佳答案

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

picture_rgb24->pts += av_rescale_q(1, { 1, 12 }, { 1, 100 });

编辑:

更好的是,我发现我可以通过编解码器访问它,而不是硬编码我的发现,并且无论如何只需要计算一次。
if (ofmt_ctx && ofmt_ctx->nb_streams > 0)
m_pts_increment = av_rescale_q(1, { 1, m_framerate }, ofmt_ctx->streams[0]->time_base);
else
m_pts_increment = av_rescale_q(1, { 1, m_framerate }, { 1, 100 });

并且只需要这样做(对于每一帧)。
picture_rgb24->pts += m_pts_increment;

关于c - FFMPEG - C API - GIF 创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60341788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com