FFmpeg 6.0环境下带原始时间戳提取视频帧的技术方案咨询
FFmpeg 6.0环境下带原始时间戳提取视频帧的技术方案咨询
我来帮你解决FFmpeg 6.0下提取带原始精确时间戳帧的问题——确实,2023年1月的更新把原来同时用-r和-fps_mode的路子堵死了,不过咱们换个思路就能完美满足你的需求:既要文件名体现原始呈现时间戳(精确到毫秒,无偏移),又能确保所有帧按时间戳顺序导出,还能把时间戳叠加到画面上。
一、提取带原始时间戳文件名的视频帧
原来的命令冲突核心是-r 1000和-fps_mode passthrough不能同时用,现在我们不需要靠-r来调整时间基,直接利用FFmpeg的image2复用器自带的PTS格式化功能,就能直接把原始呈现时间戳作为文件名,完全适配CFR/VFR场景:
ffmpeg -ss 1:23:45 -t 5 -i input.mkv -copyts -fps_mode passthrough -f image2 "%{pts:float:.3f}.jpg"
参数解释:
-copyts:保留原始视频的时间戳,不做任何偏移或修正-fps_mode passthrough:强制导出所有原始帧,不丢帧也不重复帧,完美适配VFR视频%{pts:float:.3f}:直接将原始呈现时间戳(PTS)格式化为保留3位小数的浮点数(即精确到毫秒)作为文件名,比如123.456.jpg就对应原始视频中123.456秒处的帧
如果需要更易读的时分秒格式(比如01:23:45.678.jpg),可以把文件名模板改成%{pts:hms:3}.jpg。
二、叠加时间戳到画面上
如果要把原始时间戳直接叠加到帧画面的角落,只需要加上drawtext滤镜即可,命令如下:
ffmpeg -ss 1:23:45 -t 5 -i input.mkv -copyts -fps_mode passthrough -vf "drawtext=text='PTS: %{pts:hms:3}':x=10:y=10:fontsize=24:fontcolor=white:bordercolor=black:borderw=2" -f image2 "%{pts:float:.3f}.jpg"
滤镜参数说明:
text='PTS: %{pts:hms:3}':指定叠加的文本内容,包含精确到毫秒的时分秒格式时间戳x=10:y=10:设置文本在画面左上角的位置(距离左、上各10像素)fontsize=24:fontcolor=white:bordercolor=black:borderw=2:调整字体大小、颜色,加上黑色描边让文本在复杂画面里更清晰
关于你提到的其他参数的说明
你之前疑惑的-enc_time_base和-video_track_timescale在这个场景下完全不需要:因为我们是直接读取原始视频的PTS值并格式化,不需要手动调整编码器或轨道的时间基,FFmpeg会自动处理不同视频的时间基差异,确保时间戳完全准确。
另外,这个方案完全满足你的核心需求:
- 时间戳直接取自原始视频的呈现时间,无任何偏移或 sanitization
- 支持自定义精度(把
.3f改成.6f就能精确到微秒) -fps_mode passthrough确保所有帧都被导出,且严格按时间戳顺序排列- 不需要提前判断视频是CFR还是VFR,命令自动适配
备注:内容来源于stack exchange,提问作者Pyoro
相关产品推荐
相关产品推荐

