mcpField
F
ffmpeg-stabilization-360

ffmpeg-stabilization-360

github.com/josiahsiegel创意与媒体5992 次安装19 周前更新
代码仓库

关于 ffmpeg-stabilization-360

面向需要处理抖动画面、360 视频和镜头畸变的视频编辑者的 FFmpeg 参考指南。涵盖多种稳定方法、投影转换、视角重构、缩放平移效果及校正滤镜,并提供工作流示例。

主要功能

  1. 01单遍与双遍视频稳定
  2. 02OpenCL 稳定选项
  3. 03360 投影转换与旋转
  4. 04将 360 画面重构为平面视角
  5. 05Ken Burns 缩放与平移
  6. 06镜头与透视校正

适用场景

  1. 01平滑手持或无人机拍摄画面
  2. 02转换 360 视频投影格式
  3. 03从 VR 素材提取平面视角
  4. 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最大位移160-64
edge边缘处理mirrorblank、original、clamp、mirror
blocksize运动搜索块大小84-128
contrast对比度阈值1251-255
search搜索方法exhaustiveexhaustive、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运动估计步长61-32
shakiness抖动程度(数值越高,分析越深入)51-10
accuracy检测精度151-15
result输出变换文件transforms.trf文件名
show可视化检测结果00-2

vidstabtransform 参数:

参数描述默认值范围
input变换文件transforms.trf文件名
smoothing平滑帧数(数值越高,画面越平滑)100-100
zoom缩放百分比0-100 到 100
optzoom最佳缩放计算10-2
zoomspeed每帧最大缩放变化量0.250-5
crop裁剪模式keepkeep、black
relative变换类型10-1
tripod三脚架模式(固定位置)00-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 比例)
c3x23x2 立方体贴图横向 3 个面,纵向 2 个面
c6x16x1 立方体贴图6 个面排成一行
c1x61x6 立方体贴图6 个面排成一列
eac等角立方体贴图YouTube 360 格式
dfisheye双鱼眼两张圆形鱼眼图像
sg立体投影低失真投影
flat平面/直线投影普通透视视图
barrel桶形桶形分割
fbFacebookFacebook 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.50-1
k1主系数0-1 到 1
k2次系数0-1 到 1
i插值bilinearnearest、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

最佳实践

  1. 使用 VidStab 获得更好画质 - 两遍处理速度较慢,但效果远胜 deshake
  2. 为缩放留出余量 - 稳定处理需要裁切空间
  3. 匹配帧率 - 确保处理前后 fps 一致
  4. 有 GPU 时使用 GPU - 使用 deshake_opencl 提升速度
  5. 测试系数 - 镜头校正需要反复试验
  6. 保留 360 元数据 - VR 视频使用 -map_metadata 0

本指南介绍了 2025 年的稳定处理和 360 视频处理。有关硬件加速,请参阅 ffmpeg-hardware-acceleration。有关滤镜和效果,请参阅 ffmpeg-filter-complex-patterns。

评论

支持 Markdown