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

如何修改FFmpeg命令按时间间隔提取视频关键帧

按固定时间间隔提取视频关键帧的FFmpeg解决方案

问题分析

需要按固定时间间隔(如7秒)提取关键帧:每个时间段内存在关键帧则提取1张,无则跳过,无需先提取所有关键帧再二次筛选。原命令使用mod(n,7)基于帧序号筛选,不符合时间间隔需求(帧序号与实际时间无固定对应关系,受帧率影响)。

修改后的FFmpeg命令

ffmpeg -y -i 15103.mp4 -vf "select='eq(pict_type,PICT_TYPE_I) * (t - prev_selected_t >= 7 || prev_selected_t < 0)',setpts=N/FRAME_RATE/TB" -vsync vfr -s 480x270 -frame_pts true p2/out-%d.png

参数解释

  • eq(pict_type,PICT_TYPE_I):仅筛选视频中的I帧(关键帧)
  • t - prev_selected_t >= 7 || prev_selected_t < 0:
    • t为当前帧的实际时间(单位:秒)
    • prev_selected_t是FFmpeg自动记录的上一次选中帧的时间,初始值为-1
    • 逻辑:当前I帧与上一次选中帧的时间差≥7秒,或首次选中帧时,才保留该帧,确保每个7秒时间段内仅提取1张关键帧
  • setpts=N/FRAME_RATE/TB:重置输出帧的时间戳,避免因跳帧导致的时间序列混乱
  • -vsync vfr:采用可变帧率输出,仅保留被选中的帧,避免生成冗余空帧
  • -frame_pts true:将帧的pts时间戳作为文件名后缀,方便核对提取时间

调整时间间隔方法

若要改为3秒间隔,只需将命令中的7替换为3即可:

ffmpeg -y -i 15103.mp4 -vf "select='eq(pict_type,PICT_TYPE_I) * (t - prev_selected_t >= 3 || prev_selected_t < 0)',setpts=N/FRAME_RATE/TB" -vsync vfr -s 480x270 -frame_pts true p2/out-%d.png

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:28:06