现场是这样的。用 ffmpeg 按 1fps 给一段 8 分钟的装配演示抽帧,再交给视觉模型判断拧螺丝的步骤,模型说视频里没有拧螺丝动作,人工看原片在第 3 分 12 秒只出现了 1.8 秒。

中间走过弯路,把「画面存在快速运动模糊,单帧本身不可辨」当成主因,改完现象没变。

原因不止一个,得分开看。固定 1fps 对短动作采样不足,关键帧被跳过;抽帧后按文件名排序,时间信息丢失;一次提交上百帧,超出单请求图片数量上限。

动手时先按场景变化抽帧而不是按固定间隔

ffmpeg -i demo.mp4 -vf "select='gt(scene,0.3)',showinfo" -vsync vfr frame_%04d.jpg

随后对动作密集区间加密到 4fps

ffmpeg -ss 00:03:00 -to 00:03:40 -i demo.mp4 -vf fps=4 dense_%03d.jpg

接着按批次提交并带上相对时间戳

python submit_frames.py --dir dense/ --fps 4 --start 180 --batch 8

末了把模型结论按时间轴还原成步骤序列

python timeline.py --answers ans/ --out steps.json

恢复的判定其实很直接。第 3 分 12 秒附近的帧被抽到,模型正确识别出拧螺丝动作,步骤序列与人工整理一致,没有遗漏关键工序。

这里还有个坑。抽帧频率要和动作时长匹配,按场景切换抽帧再对重点区间加密,比整体提高 fps 更省 token 也更准。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189