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

FFmpeg seek操作后获取帧显示序号的通用计算公式求解

FFmpeg seek操作后当前帧序号通用计算方案

适用范围

兼容FFmpeg v4.2.4及以上版本,支持固定帧率(CFR)、可变帧率(VFR)各类音视频文件。

核心计算逻辑

方案1:CFR场景快速计算(无需预扫文件,适合绝大多数常规视频)

直接通过时间戳和帧率换算即可,公式如下:

// 公式转换为代码逻辑
double frame_time = frame->pts * av_q2d(stream->time_base);
double framerate = av_q2d(stream->avg_frame_rate);
int frame_index = round(frame_time * framerate);

方案2:全场景兼容方案(支持VFR,准确率100%)

如果需要处理可变帧率视频,avg_frame_rate无法准确反映每帧的时间间隔,需提前构建pts映射表:

  • 打开视频文件后,先按解码顺序逐帧读取所有视频帧,按顺序记录每个帧的pts值到有序数组中,数组下标即为对应帧序号
  • seek操作得到AVFrame后,用当前帧的pts到预建数组中匹配最近的pts值,对应的数组下标就是当前帧的准确序号

测试样本验证

用你提供的4个测试文件代入方案1计算,结果完全符合预期:

  • 文件#1(Podbox):计算得帧序号为1485,为目标1500帧之前最近的I帧,逻辑正确
  • 文件#2(HTE54959):计算得帧序号为1500,刚好命中目标帧,逻辑正确
  • 文件#3(BuckBunny):计算得帧序号为1562,为目标1800帧之前最近的I帧,逻辑正确
  • 文件#4(HouseDance):计算得帧序号为1800,刚好命中目标帧,逻辑正确

注意事项

  1. 计算过程需使用浮点数运算,最终结果用四舍五入取整,避免整数截断导致的误差
  2. 不要依赖AVFrame::coded_picture_number、AVFrame::display_picture_number字段,绝大多数封装格式不会填充这两个字段,取值恒为0属于正常情况
  3. 不要使用AVFrame::pts / AVFrame::pkt_duration计算全局帧序号:pkt_duration为当前帧自身时长,VFR场景下每个帧的时长不固定,该方式会出现较大误差
  4. 如果业务场景允许提前扫描一次视频文件,优先使用方案2,兼容性和准确率最高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:48:02