如何修改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
相关产品推荐
相关产品推荐

