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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:37:59