mcpField
F
ffmpeg-stabilization-360

ffmpeg-stabilization-360

github.com/josiahsiegelCreative & media5992 installsUpdated 19w ago
Repository

About ffmpeg-stabilization-360

An FFmpeg reference for editors handling shaky footage, 360 video, and lens distortion. It covers stabilization methods, projection conversion, reframing, zoom-and-pan effects, and correction filters with example workflows.

Key features

  1. 01Single- and two-pass stabilization
  2. 02OpenCL stabilization option
  3. 03360 projection conversion and rotation
  4. 04360 reframing to flat views
  5. 05Ken Burns zoom and pan
  6. 06Lens and perspective correction

Use cases

  1. 01Smoothing handheld or drone footage
  2. 02Converting 360 video projections
  3. 03Extracting a flat view from VR footage
  4. 04Correcting action-camera lens distortion

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill ffmpeg-stabilization-360

After installing, type/ffmpeg-stabilization-360in Claude Code to confirm it loaded.

Details

From the project README

CRITICAL GUIDELINES

Windows File Path Requirements

MANDATORY: Always Use Backslashes on Windows for File Paths

When using Edit or Write tools on Windows, you MUST use backslashes (\) in file paths, NOT forward slashes (/).


Quick Reference

TaskFilterCommand Pattern
Basic stabilizationdeshake-vf deshake
VidStab (2-pass)vidstabSee two-pass workflow
OpenCL stabilizationdeshake_opencl-vf deshake_opencl
360 projectionv360-vf v360=e:c3x2
Ken Burns effectzoompan-vf zoompan=z='...'
Lens correctionlenscorrection-vf lenscorrection=k1=...

When to Use This Skill

Use for motion correction and VR workflows:

  • Stabilizing shaky handheld footage
  • Action camera (GoPro, DJI) processing
  • Drone video smoothing
  • 360/VR video format conversion
  • Creating zoom/pan effects
  • Correcting lens distortion

FFmpeg Stabilization & 360 Video (2025)

Comprehensive guide to video stabilization, VR processing, and motion effects.

Video Stabilization

deshake - Basic Stabilization

Built-in single-pass stabilization filter.

# 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

Parameters:

ParameterDescriptionDefaultRange
x, yMotion search start-1 (auto)0-width/height
w, hMotion search size-1 (auto)0-width/height
rx, ryMaximum shift160-64
edgeEdge handlingmirrorblank, original, clamp, mirror
blocksizeBlock size for motion search84-128
contrastContrast threshold1251-255
searchSearch methodexhaustiveexhaustive, less

Edge modes:

  • blank - Fill edges with black
  • original - Keep original edge pixels
  • clamp - Clamp to edge values
  • mirror - Mirror edge pixels (usually best)
deshake_opencl - GPU-Accelerated Stabilization

Faster stabilization using 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 - Professional Two-Pass Stabilization

VidStab provides the highest quality stabilization using a two-pass approach.

Pass 1: Analyze motion

# Analyze video and save transform data
ffmpeg -i shaky.mp4 \
  -vf "vidstabdetect=stepsize=6:shakiness=8:accuracy=9:result=transforms.trf" \
  -f null -

Pass 2: Apply transforms

# Apply stabilization with transforms
ffmpeg -i shaky.mp4 \
  -vf "vidstabtransform=input=transforms.trf:zoom=1:smoothing=30" \
  stable.mp4

vidstabdetect Parameters:

ParameterDescriptionDefaultRange
stepsizeStep size for motion estimation61-32
shakinessShakiness amount (higher = more analysis)51-10
accuracyDetection accuracy151-15
resultOutput transform filetransforms.trffilename
showVisualize detection00-2

vidstabtransform Parameters:

ParameterDescriptionDefaultRange
inputTransform filetransforms.trffilename
smoothingSmoothing frames (higher = smoother)100-100
zoomZoom percentage0-100 to 100
optzoomOptimal zoom calculation10-2
zoomspeedMax zoom change per frame0.250-5
cropCropping modekeepkeep, black
relativeTransform type10-1
tripodTripod mode (fixed position)00-1

Complete VidStab workflow:

#!/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"
Stabilization Comparison
MethodQualitySpeedGPUUse Case
deshakeGoodFastNoQuick fixes
deshake_openclGoodVery FastYesQuick fixes with GPU
vidstab (2-pass)BestSlowNoProfessional work

360/VR Video Processing

v360 - 360 Video Projection Conversion

Converts between various 360 video projections.

# 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

Input/Output Projections:

CodeProjectionDescription
eEquirectangularStandard 360 format (2:1 ratio)
c3x2Cubemap 3x23 faces wide, 2 high
c6x1Cubemap 6x16 faces in a row
c1x6Cubemap 1x66 faces in a column
eacEqui-Angular CubemapYouTube 360 format
dfisheyeDual FisheyeTwo circular fisheye images
sgStereographicLow distortion projection
flatFlat/RectilinearNormal perspective view
barrelBarrelBarrel split
fbFacebookFacebook 360 format

Parameters:

ParameterDescriptionExample
id_fovInput diagonal FOVid_fov=195
ih_fov, iv_fovInput H/V FOVih_fov=190:iv_fov=190
yaw, pitch, rollRotation anglesyaw=90:pitch=0
w, hOutput sizew=4096:h=2048
interpInterpolationnearest, linear, cubic, lanczos
360 Video Rotation and Reframing
# 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
Stereoscopic 360 Processing
# 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

Ken Burns and Zoom Effects

zoompan - Pan and Zoom Animation

Creates Ken Burns style effects on still images or video.

# 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

Parameters:

ParameterDescriptionExample
zZoom factor expressionz='min(zoom+0.001,1.5)'
x, yPan position expressionx='iw/2'
dDuration per image (frames)d=125
sOutput sizes=1920x1080
fpsOutput frame ratefps=30

Useful expressions:

  • zoom - Current zoom value
  • pzoom - Previous zoom value
  • iw, ih - Input width/height
  • on - Output frame number
Animated Slideshow Example
# 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

Lens Correction

lenscorrection - Barrel/Pincushion Correction

Corrects lens distortion mathematically.

# 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

Parameters:

ParameterDescriptionDefaultRange
cx, cyCenter position0.50-1
k1Primary coefficient0-1 to 1
k2Secondary coefficient0-1 to 1
iInterpolationbilinearnearest, bilinear

Tips for finding coefficients:

  • Barrel distortion (fisheye): negative k1 (-0.1 to -0.5)
  • Pincushion distortion: positive k1 (0.1 to 0.5)
  • Start with k2=0, adjust k1 first
lensfun - Database-Driven Lens Correction

Uses the lensfun database for automatic lens correction.

# 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

Requires: lensfun library and database installed

perspective - Perspective Correction

Corrects keystone/perspective distortion.

# 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

Common Workflows

Action Camera Processing
# 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
Drone Footage Processing
# 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 Camera to Flat Video
# 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

Best Practices

  1. VidStab for quality - Two-pass is slower but much better than deshake
  2. Allow zoom headroom - Stabilization needs room to crop
  3. Match frame rates - Ensure consistent fps before and after
  4. GPU when available - Use deshake_opencl for speed
  5. Test coefficients - Lens correction needs experimentation
  6. Preserve 360 metadata - Use -map_metadata 0 for VR videos

This guide covers stabilization and 360 processing for 2025. For hardware acceleration, see ffmpeg-hardware-acceleration. For filters and effects, see ffmpeg-filter-complex-patterns.

Comments

Markdown supported