You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FFmpeg C/C++拼接图片时指定分数帧率?

如何在FFmpeg中指定23.976/59.94这类分数帧率?

你遇到的问题核心是FFmpeg的AVRational结构体仅支持整数分子与分母,直接传入浮点数会被强制截断为整数,导致帧率配置错误。这类所谓的“浮点帧率”其实是NTSC制式下的标准分数帧率,正确的做法是用精确的分数形式表示,或者通过FFmpeg提供的工具函数将浮点数转为合法的AVRational。

解决方案1:直接使用标准分数初始化

这类常用帧率对应的精确分数如下:

  • 23.976(你提到的23.797应为笔误):24000/1001
  • 59.94:60000/1001

代码示例:

AVStream* st;
// 设置帧率为23.976fps
st->r_frame_rate = (AVRational){24000, 1001};
// 时间基准取帧率的倒数,确保时间计算精确
st->time_base = av_inv_q(st->r_frame_rate);

// 若要设置59.94fps,只需修改对应分数
// st->r_frame_rate = (AVRational){60000, 1001};
// st->time_base = av_inv_q(st->r_frame_rate);

解决方案2:用av_d2q将浮点数转为AVRational

如果需要从浮点数动态转换,可以使用FFmpeg的av_d2q函数,它会自动找到与浮点数最接近的分数(可指定分母的最大值,避免分数过大):

AVStream* st;
// 将23.976转为AVRational,第二个参数1001是分母的最大允许值
AVRational fps = av_d2q(23.976, 1001);
st->r_frame_rate = fps;
st->time_base = av_inv_q(fps);

// 转换59.94同理
// AVRational fps = av_d2q(59.94, 1001);

注意事项

  • 绝对不要直接给AVRational的分子/分母传浮点数,比如(AVRational){1, 23.976}会被截断为{1,23},完全不符合预期。
  • 建议同时设置r_frame_rate和time_base,确保编码器能正确识别帧率与时间基准,避免编码时出现时间戳错误。

内容的提问来源于stack exchange,提问作者Turgut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:26:27