先看现象。做监控回放摘要时,把一段 10 分钟视频按每 24 秒取一帧,拼成 25 张图连同序号一起发给 gpt-4o,让它输出带时间点的事件,结果它把第 3 帧说成第 5 分钟,和真实时间差了一倍多。

把日志和配置对完,能解释这个现象的基本就这几处。模型并不知道帧与帧之间的真实间隔,只在猜顺序。另一种情况是帧序号从 1 开始而文案里写的是从 0 开始。

少数情况下是图片文件名里的时间戳没有被写进提示词。

不容易想到的是,视频本身有可变帧率,抽帧时刻不均匀。

第一件事是用 ffprobe 打印每帧的真实 pts

ffprobe -v error -select_streams v -show_entries frame=pkt_pts_time -of csv sample.mp4 | head -30

随后把时间点直接烧进图片左上角

ffmpeg -i sample.mp4 -vf "fps=1/24,drawtext=text='%{pts\:hms}':x=10:y=10" out_%03d.jpg

提示词里给出帧号与时间点的映射表

python -c "print({i: i*24 for i in range(25)})"

要求输出严格按给定时间点引用

curl https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $KEY" -d @frames.json

怎么算真的好了,看的是同一批现象。输出的事件时间点与画面里的烧录时间一致,抽查三段都能对上原始视频,偏差控制在一个采样间隔内。

提醒一点。模型没有时间概念,时间信息必须以文字或画面像素的形式显式给出,靠帧序号推断一定会漂。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189