February 17, 2018
Stabilizing GoPro Video with FFmpeg and vid.stab
Here are commands to run vid.stab to stabilize shakey GoPro videos. vid.stab is free software that is integrated into ffmpeg, an open source video processing tool with a command line interface. Here’s a very impressive demo of stabilization from vid.stab’s site:
Video from http://public.hronopik.de/vid.stab/
And another video from another user:
Video from https://gist.github.com/maxogden/43219d6dcb9006042849
Get vid.stab with the right version of ffmpeg
brew install ffmpeg
installed a build of ffmpeg without the vid.stab plugin compiled in. ffmpeg from the ffmpeg site includes vid.stab, so get it from there.
After linking the ffmpeg executable to the /usr/local/bin folder, running ffmpeg
shows me this:
$ ffmpeg
ffmpeg version 3.4.2-tessus Copyright (c) 2000-2018 the FFmpeg developers
built with Apple LLVM version 9.0.0 (clang-900.0.39.2)
configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzmq --enable-libzvbi --enable-version3 --pkg-config-flags=--static --disable-ffplay
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Use -h to get full help or, even better, run 'man ffmpeg'
I’m using ffmpeg 3.4.2, and the configration line includes --enable-libvidstab
which is what I need.
Workflow suggestions
It took me lots of trial and error to find settings I liked. To speed up my process, I:
- use flags
-t
(duration) and-ss
(position) to work on a small segment of the video (instead of the whole video) - use
-y
flag to allow overwriting previous files (don’t use this if you want to compare outputs side-by-side, your previous attempts will be overwritten) - leave out audio with the
-an
flag - scale down video dimensions with the
scale
filter
I skip these flags for the final encode once I find settings I like for a video.
Test different settings
vid.stab’s docs go into detail about what all the parameters like stepsize
, shakiness
, and accuracy
do. Sometimes I wasn’t sure if changing them made a difference.
There are 2 seteps to the stabilization process:
-
Generate info about shakes and save it to transform_vectors.trf
- best improvement comes bigger stepsize. 32 is max
ffmpeg -t 5 -i GOPR7182.MP4 -vf vidstabdetect=stepsize=32:shakiness=10:accuracy=10:result=transform_vectors.trf -f null -
-
Stabilize the video using data from the first pass
- high smoothing (30) makes for more wobbly jello-y frames, 10 looks good to me
- for best compression quality: remove scale filter, add ‘-preset slow’
ffmpeg -t 5 -i GOPR7182.MP4 -y -vf vidstabtransform=input=transform_vectors.trf:zoom=0:smoothing=10,unsharp=5:5:0.8:3:3:0.4,scale=480:-1 -vcodec libx264 -tune film -an stabilized.mp4
After a bunch of test encodes, I found some settings that worked for my video, and tweaked the commands a bit for my final output.
Final Output
-
Remove
-t 5
so that the whole video is processedffmpeg -i GOPR7182.MP4 -vf vidstabdetect=stepsize=32:shakiness=10:accuracy=10:result=transform_vectors.trf -f null -
-
For the final output:
- remove scaling
- use
-acodec copy
to copy the audio stream from the source video file to the stabilized video file - add
-tune film
and-preset slow
which might help with x264’s compression quality - remove
-y
flag so ffmpeg confirms overwriting previous files
ffmpeg -i GOPR7182.MP4 -vf vidstabtransform=input=transform_vectors.trf:zoom=0:smoothing=10,unsharp=5:5:0.8:3:3:0.4 -vcodec libx264 -tune film -acodec copy -preset slow stabilized.mp4
Other stuff
- what x264’s
-tune film
is for - what x264’s
-preset slow
is for - Max Ogden & Paul Irish’s example commands (including how to make side-by-side comparison video, like the cat video above)
- Another blog post on using vid.stab
- I found ffmpeg’s
deshake
filter did not improve my video much. vid.stab was very effective after fiddling with settings for an hour.