如何在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
相关产品推荐
相关产品推荐

