关于 ffmpeg-stabilization-360
面向需要处理抖动画面、360 视频和镜头畸变的视频编辑者的 FFmpeg 参考指南。涵盖多种稳定方法、投影转换、视角重构、缩放平移效果及校正滤镜,并提供工作流示例。
主要功能
- 01单遍与双遍视频稳定
- 02OpenCL 稳定选项
- 03360 投影转换与旋转
- 04将 360 画面重构为平面视角
- 05Ken Burns 缩放与平移
- 06镜头与透视校正
适用场景
- 01平滑手持或无人机拍摄画面
- 02转换 360 视频投影格式
- 03从 VR 素材提取平面视角
- 04校正运动相机镜头畸变
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill ffmpeg-stabilization-360安装后在 Claude Code 中输入/ffmpeg-stabilization-360确认已加载。
详细介绍
关键指南
Windows 文件路径要求
必须:在 Windows 上始终使用反斜杠表示文件路径
在 Windows 上使用 Edit 或 Write 工具时,必须在文件路径中使用反斜杠(\),不能使用正斜杠(/)。
快速参考
| 任务 | 滤镜 | 命令模式 |
|---|---|---|
| 基本防抖 | deshake | -vf deshake |
| VidStab(两遍) | vidstab | 请参阅两遍工作流 |
| OpenCL 防抖 | deshake_opencl | -vf deshake_opencl |
| 360 投影 | v360 | -vf v360=e:c3x2 |
| 肯·伯恩斯效果 | zoompan | -vf zoompan=z='...' |
| 镜头校正 | lenscorrection | -vf lenscorrection=k1=... |
何时使用此技能
用于运动校正和 VR 工作流:
- 稳定手持拍摄的抖动画面
- 处理运动相机(GoPro、DJI)素材
- 平滑无人机视频
- 转换 360/VR 视频格式
- 创建缩放/平移效果
- 校正镜头畸变
FFmpeg 防抖与 360 视频(2025)
视频防抖、VR 处理和运动效果综合指南。
视频防抖
deshake - 基本防抖
内置的单遍防抖滤镜。
# Basic stabilization
ffmpeg -i shaky.mp4 -vf "deshake" stable.mp4
# With custom parameters
ffmpeg -i shaky.mp4 -vf "deshake=x=-1:y=-1:w=-1:h=-1:rx=16:ry=16" stable.mp4
# Strong stabilization
ffmpeg -i shaky.mp4 -vf "deshake=rx=64:ry=64:edge=mirror" stable.mp4
参数:
| 参数 | 描述 | 默认值 | 范围 |
|---|---|---|---|
x、y | 运动搜索起点 | -1(自动) | 0-宽度/高度 |
w、h | 运动搜索尺寸 | -1(自动) | 0-宽度/高度 |
rx、ry | 最大位移 | 16 | 0-64 |
edge | 边缘处理 | mirror | blank、original、clamp、mirror |
blocksize | 运动搜索块大小 | 8 | 4-128 |
contrast | 对比度阈值 | 125 | 1-255 |
search | 搜索方法 | exhaustive | exhaustive、less |
边缘模式:
blank- 用黑色填充边缘original- 保留原始边缘像素clamp- 将边缘限制在边缘值mirror- 镜像边缘像素(通常效果最佳)
deshake_opencl - GPU 加速防抖
使用 OpenCL 加快防抖处理。
# OpenCL stabilization
ffmpeg -i shaky.mp4 \
-vf "hwupload,deshake_opencl,hwdownload,format=yuv420p" \
stable.mp4
# With custom parameters
ffmpeg -i shaky.mp4 \
-vf "hwupload,deshake_opencl=tripod=0:smooth=9:adaptive_crop=1,hwdownload,format=yuv420p" \
stable.mp4
VidStab - 专业两遍防抖
VidStab 采用两遍处理方式,可提供最高质量的防抖效果。
第一遍:分析运动
# Analyze video and save transform data
ffmpeg -i shaky.mp4 \
-vf "vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result=transforms.trf" \
-f null -
第二遍:应用变换
# Apply stabilization with transforms
ffmpeg -i shaky.mp4 \
-vf "vidstabtransform=input=transforms.trf:zoom=1:smoothing=30" \
stable.mp4
vidstabdetect 参数:
| 参数 | 描述 | 默认值 | 范围 |
|---|---|---|---|
stepsize | 运动估计步长 | 6 | 1-32 |
shakiness | 抖动程度(数值越高,分析越深入) | 5 | 1-10 |
accuracy | 检测精度 | 15 | 1-15 |
result | 输出变换文件 | transforms.trf | 文件名 |
show | 可视化检测结果 | 0 | 0-2 |
vidstabtransform 参数:
| 参数 | 描述 | 默认值 | 范围 |
|---|---|---|---|
input | 变换文件 | transforms.trf | 文件名 |
smoothing | 平滑帧数(数值越高,画面越平滑) | 10 | 0-100 |
zoom | 缩放百分比 | 0 | -100 到 100 |
optzoom | 最佳缩放计算 | 1 | 0-2 |
zoomspeed | 每帧最大缩放变化量 | 0.25 | 0-5 |
crop | 裁剪模式 | keep | keep、black |
relative | 变换类型 | 1 | 0-1 |
tripod | 三脚架模式(固定位置) | 0 | 0-1 |
完整的 VidStab 工作流:
#!/bin/bash
# Professional stabilization workflow
INPUT="$1"
OUTPUT="${1%.*}_stabilized.mp4"
echo "Pass 1: Analyzing motion..."
ffmpeg -i "$INPUT" \
-vf "vidstabdetect=stepsize=6:shakiness=8:accuracy=15:result=transforms.trf" \
-f null -
echo "Pass 2: Applying stabilization..."
ffmpeg -i "$INPUT" \
-vf "vidstabtransform=input=transforms.trf:smoothing=30:zoom=2:optzoom=1" \
-c:v libx264 -crf 18 -preset slow \
-c:a copy \
"$OUTPUT"
rm transforms.trf
echo "Stabilized: $OUTPUT"
防抖方式比较
| 方法 | 质量 | 速度 | GPU | 使用场景 |
|---|---|---|---|---|
deshake | 良好 | 快 | 否 | 快速修正 |
deshake_opencl | 良好 | 非常快 | 是 | 使用 GPU 快速修正 |
vidstab(两遍) | 最佳 | 慢 | 否 | 专业工作 |
360/VR 视频处理
v360 - 360 视频投影转换
在各种 360 视频投影格式之间进行转换。
# Equirectangular to Cubemap 3x2
ffmpeg -i equirect.mp4 -vf "v360=e:c3x2" cubemap.mp4
# Equirectangular to Cubemap 6x1
ffmpeg -i equirect.mp4 -vf "v360=e:c6x1" cubemap_6x1.mp4
# Cubemap to Equirectangular
ffmpeg -i cubemap.mp4 -vf "v360=c3x2:e" equirect.mp4
# Equirectangular to EAC (YouTube format)
ffmpeg -i equirect.mp4 -vf "v360=e:eac" youtube_360.mp4
# Dual fisheye to Equirectangular
ffmpeg -i dual_fisheye.mp4 -vf "v360=dfisheye:e:ih_fov=190:iv_fov=190" equirect.mp4
输入/输出投影:
| 代码 | 投影 | 描述 |
|---|---|---|
e | 等距柱状投影 | 标准 360 格式(2:1 比例) |
c3x2 | 3x2 立方体贴图 | 横向 3 个面,纵向 2 个面 |
c6x1 | 6x1 立方体贴图 | 6 个面排成一行 |
c1x6 | 1x6 立方体贴图 | 6 个面排成一列 |
eac | 等角立方体贴图 | YouTube 360 格式 |
dfisheye | 双鱼眼 | 两张圆形鱼眼图像 |
sg | 立体投影 | 低失真投影 |
flat | 平面/直线投影 | 普通透视视图 |
barrel | 桶形 | 桶形分割 |
fb | Facebook 360 格式 |
参数:
| 参数 | 描述 | 示例 |
|---|---|---|
id_fov | 输入对角线视场角 | id_fov=195 |
ih_fov、iv_fov | 输入水平/垂直视场角 | ih_fov=190:iv_fov=190 |
yaw、pitch、roll | 旋转角度 | yaw=90:pitch=0 |
w、h | 输出尺寸 | w=4096:h=2048 |
interp | 插值 | nearest、linear、cubic、lanczos |
360 视频旋转与重新取景
# Rotate 360 video 90 degrees
ffmpeg -i input_360.mp4 -vf "v360=e:e:yaw=90" rotated.mp4
# Tilt view up
ffmpeg -i input_360.mp4 -vf "v360=e:e:pitch=-30" tilted.mp4
# Extract flat view from 360
ffmpeg -i 360_video.mp4 \
-vf "v360=e:flat:h_fov=120:v_fov=90:yaw=45:pitch=-10:w=1920:h=1080" \
flat_extract.mp4
立体 360 处理
# Split top-bottom stereo to left eye only
ffmpeg -i stereo_tb.mp4 -vf "v360=e:e:in_stereo=tb:out_stereo=2d" left_eye.mp4
# Convert side-by-side to top-bottom
ffmpeg -i stereo_sbs.mp4 -vf "v360=e:e:in_stereo=sbs:out_stereo=tb" stereo_tb.mp4
肯·伯恩斯效果与缩放效果
zoompan - 平移和缩放动画
为静态图像或视频创建肯·伯恩斯风格的效果。
# Basic zoom in on center
ffmpeg -loop 1 -i image.jpg -t 5 \
-vf "zoompan=z='min(zoom+0.001,1.5)':d=125" \
-c:v libx264 zoom_in.mp4
# Zoom in from top-left to center
ffmpeg -loop 1 -i image.jpg -t 5 \
-vf "zoompan=z='min(zoom+0.001,1.5)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125:s=1920x1080" \
ken_burns.mp4
# Pan across image
ffmpeg -loop 1 -i image.jpg -t 10 \
-vf "zoompan=z=1.3:x='if(gte(x,iw-iw/zoom),0,x+1)':y='ih/2-(ih/zoom/2)':d=1:s=1920x1080" \
pan.mp4
# Zoom out
ffmpeg -loop 1 -i image.jpg -t 5 \
-vf "zoompan=z='if(lte(zoom,1.0),1.5,max(1.001,zoom-0.002))':d=125:s=1920x1080" \
zoom_out.mp4
参数:
| 参数 | 描述 | 示例 |
|---|---|---|
z | 缩放系数表达式 | z='min(zoom+0.001,1.5)' |
x、y | 平移位置表达式 | x='iw/2' |
d | 每张图像的持续时间(帧) | d=125 |
s | 输出尺寸 | s=1920x1080 |
fps | 输出帧率 | fps=30 |
实用表达式:
zoom- 当前缩放值pzoom- 上一个缩放值iw、ih- 输入宽度/高度on- 输出帧编号
动画幻灯片示例
# Create slideshow with Ken Burns
ffmpeg -loop 1 -t 5 -i img1.jpg \
-loop 1 -t 5 -i img2.jpg \
-loop 1 -t 5 -i img3.jpg \
-filter_complex "\
[0:v]zoompan=z='min(zoom+0.001,1.3)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=150:s=1920x1080:fps=30[v0];\
[1:v]zoompan=z=1.3:x='if(gte(x,iw-iw/zoom),0,x+2)':y='ih/2-(ih/zoom/2)':d=150:s=1920x1080:fps=30[v1];\
[2:v]zoompan=z='1.3-0.002*on':d=150:s=1920x1080:fps=30[v2];\
[v0][v1]xfade=transition=fade:duration=1:offset=4[x1];\
[x1][v2]xfade=transition=fade:duration=1:offset=8[out]" \
-map "[out]" slideshow.mp4
镜头校正
lenscorrection - 桶形/枕形校正
通过数学方法校正镜头畸变。
# Correct barrel distortion
ffmpeg -i distorted.mp4 -vf "lenscorrection=k1=-0.2:k2=-0.05" corrected.mp4
# Correct pincushion distortion
ffmpeg -i distorted.mp4 -vf "lenscorrection=k1=0.2:k2=0.05" corrected.mp4
# With center offset
ffmpeg -i distorted.mp4 -vf "lenscorrection=cx=0.5:cy=0.5:k1=-0.2:k2=-0.05" corrected.mp4
参数:
| 参数 | 描述 | 默认值 | 范围 |
|---|---|---|---|
cx、cy | 中心位置 | 0.5 | 0-1 |
k1 | 主系数 | 0 | -1 到 1 |
k2 | 次系数 | 0 | -1 到 1 |
i | 插值 | bilinear | nearest、bilinear |
确定系数的技巧:
- 桶形畸变(鱼眼):k1 取负值(-0.1 到 -0.5)
- 枕形畸变:k1 取正值(0.1 到 0.5)
- 从 k2=0 开始,先调整 k1
lensfun - 基于数据库的镜头校正
使用 lensfun 数据库自动校正镜头。
# Auto-detect lens from metadata
ffmpeg -i photo.jpg -vf "lensfun=make=Canon:model=EOS 5D Mark II:lens_model=Canon EF 24-70mm" corrected.jpg
# With specific parameters
ffmpeg -i video.mp4 -vf "lensfun=make=GoPro:model=HERO10:mode=geometry" corrected.mp4
需要:安装 lensfun 库和数据库
perspective - 透视校正
校正梯形/透视畸变。
# Correct perspective with four corner points
# Map corners: (x0,y0)-(x1,y1)-(x2,y2)-(x3,y3) to rectangle
ffmpeg -i skewed.mp4 \
-vf "perspective=x0=100:y0=50:x1=1820:y1=80:x2=0:y2=1030:x3=1920:y3=1000:interpolation=linear" \
corrected.mp4
# Interactive: find coordinates with test overlay first
ffmpeg -i skewed.mp4 -vf "drawgrid=w=100:h=100:c=red" grid_overlay.mp4
常见工作流
运动相机素材处理
# GoPro footage: stabilize + lens correct + encode
ffmpeg -i GOPR0001.MP4 \
-vf "lenscorrection=k1=-0.2:k2=-0.05,vidstabdetect=shakiness=8:result=gopro.trf" \
-f null -
ffmpeg -i GOPR0001.MP4 \
-vf "lenscorrection=k1=-0.2:k2=-0.05,vidstabtransform=input=gopro.trf:smoothing=20:zoom=5" \
-c:v libx264 -crf 18 \
gopro_processed.mp4
无人机素材处理
# DJI footage: stabilize and enhance
ffmpeg -i DJI_0001.MP4 \
-vf "vidstabdetect=shakiness=5:stepsize=6:result=drone.trf" -f null -
ffmpeg -i DJI_0001.MP4 \
-vf "vidstabtransform=input=drone.trf:smoothing=40:zoom=2,eq=contrast=1.1:saturation=1.2" \
-c:v libx264 -crf 18 -preset slow \
drone_processed.mp4
360 摄像机转为平面视频
# Extract interesting view from 360 footage
ffmpeg -i insta360.mp4 \
-vf "v360=e:flat:h_fov=110:v_fov=70:yaw=45:pitch=-15:w=1920:h=1080,deshake" \
flat_view.mp4
最佳实践
- 使用 VidStab 获得更好画质 - 两遍处理速度较慢,但效果远胜 deshake
- 为缩放留出余量 - 稳定处理需要裁切空间
- 匹配帧率 - 确保处理前后 fps 一致
- 有 GPU 时使用 GPU - 使用 deshake_opencl 提升速度
- 测试系数 - 镜头校正需要反复试验
- 保留 360 元数据 - VR 视频使用
-map_metadata 0
本指南介绍了 2025 年的稳定处理和 360 视频处理。有关硬件加速,请参阅 ffmpeg-hardware-acceleration。有关滤镜和效果,请参阅 ffmpeg-filter-complex-patterns。
评论
支持 Markdown