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

如何用FFmpeg快速提取视频中动态移动的128x128裁剪区域

动态帧裁剪+固定尺寸输出的FFmpeg解决方案

针对你用FFmpeg实现逐帧动态裁剪、输出固定128x128序列帧时出现的黑边、X轴错位问题,可按以下步骤解决:

核心思路

先对每帧动态裁剪目标区域,再将裁剪后的画面缩放到128x128,避免因尺寸不匹配或坐标转换错误导致的画面异常。关键是要将目标检测模型输出的裁剪坐标正确转换为FFmpeg可识别的参数,并通过动态滤镜指令实现逐帧参数更新。

步骤1:生成逐帧裁剪指令文件

从目标检测模型中提取每帧的裁剪参数(输入帧上的左上角坐标x、y,裁剪宽度w、高度h),按FFmpeg sendcmd滤镜的格式生成指令文件(比如命名为crop_commands.txt)。格式示例:

# 帧序号从0开始,每帧对应一条crop参数修改指令
0.0 crop=x=100:y=200:w=300:h=300
0.033 crop=x=105:y=202:w=300:h=300
0.066 crop=x=110:y=205:w=300:h=300
# ... 后续所有帧的指令,时间戳对应帧的播放时间(单位秒)

注意:

  • 时间戳可按帧序号 / 视频帧率计算(比如30fps视频,第n帧的时间戳是n/30)
  • 若模型输出的是中心坐标cx、cy,需转换为左上角坐标:x = cx - w/2,y = cy - h/2
  • 确保x、y、w、h均为非负整数,且x+w不超过输入帧宽度,y+h不超过输入帧高度

步骤2:执行FFmpeg命令处理视频

使用以下命令读取原视频,动态裁剪后输出固定128x128的序列帧:

ffmpeg -i input_video.mp4 -filter_complex "[0:v]sendcmd=f=crop_commands.txt,crop,scale=128:128[v]" -map "[v]" -q:v 2 output_crops/frame_%06d.jpg

参数说明:

  • -sendcmd=f=crop_commands.txt:加载逐帧裁剪指令文件,动态更新crop滤镜参数
  • crop:应用动态裁剪参数(无需手动指定固定值,由指令文件控制)
  • scale=128:128:将裁剪后的画面强制缩放到固定尺寸
  • -q:v 2:设置JPG输出质量(值越小质量越高,1-31可选)
  • output_crops/frame_%06d.jpg:输出序列帧的路径格式,自动按序号命名

问题原因排查(针对你之前的异常)

  1. 下方黑边:大概率是裁剪后的高度无法被2整除(FFmpeg部分编码器要求尺寸为偶数),或指令中y+h超过输入帧高度导致裁剪区域越界。可在生成指令时对h做取偶处理,或确保y+h ≤ 输入帧高度。
  2. X轴错位:通常是坐标转换错误,比如将模型输出的中心坐标直接作为左上角坐标,或混淆了输入帧的宽高顺序(误将高度方向的参数用在宽度上)。需核对模型输出的坐标定义,确保转换为FFmpeg的左上角坐标系。

额外优化:避免磁盘IO瓶颈

若动作识别模型支持从管道读取帧数据,可将FFmpeg的输出直接通过管道传给Python,无需写入磁盘:

ffmpeg -i input_video.mp4 -filter_complex "[0:v]sendcmd=f=crop_commands.txt,crop,scale=128:128[v]" -map "[v]" -f rawvideo -pix_fmt rgb24 - | python action_recognition.py

在action_recognition.py中从sys.stdin读取原始帧数据,解析为128x128的RGB图像后输入模型,进一步提升整体流程效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:52:33