三脚なしの手持ち撮影や歩きながらの動画は、どうしても手ブレが乗ってしまいます。FFmpeg の vidstab は、まず映像を解析して揺れを検出し(vidstabdetect)、その結果をもとに揺れを打ち消す(vidstabtransform)2パス方式で安定化します。この記事ではパイプラインの流れ、smoothingcrop などの主要パラメータ、libvidstab の導入方法、限界と代替案までを解説します。


前提条件: vidstabdetectおよびvidstabtransformフィルターは、FFmpegが--enable-libvidstab付きでビルドされている必要があります。Ubuntu / Debian の apt install ffmpeg は条件を満たします(本サイトのCIで実測。詳細はインストール)。まず ffmpeg -filters | grep vidstab で確認してください。


動画手ブレ補正の仕組み

FFmpegの動画手ブレ補正は外部ライブラリlibvidstabに依存し、2つのフィルターを使用します:

  1. vidstabdetect — パス1: 動画のカメラ動きを分析し、モーションベクターファイル(デフォルト: transforms.trf)に書き出す
  2. vidstabtransform — パス2: モーションデータを読み込み、揺れを打ち消す変換(平行移動・回転)を適用する

2パス方式が必要な理由:フィルターが滑らかなカメラパスを計算するために、動き全体の軌跡を事前に把握する必要があるからです。


基本的な2パス手ブレ補正

注意: このセクションのFFmpegコマンドはすべて --enable-libvidstab が必要です。以下のコマンドは Ubuntu 標準の apt install ffmpeg ビルドに対して本サイトのCIで毎回実行しており、参考掲載ではなく実行確認済みです。

パス1 — モーション検出:

# requires --enable-libvidstab
ffmpeg -i input.mp4 -vf vidstabdetect -f null /dev/null

カレントディレクトリにtransforms.trfが書き出されます。

パス2 — 手ブレ補正:

# requires --enable-libvidstab
ffmpeg -i input.mp4 -vf vidstabtransform output.mp4

transforms.trfを読み込み、安定化された動画を生成します。


補正強度の調整

パス1:shakiness

shakinessパラメータ(1〜10、デフォルト: 5)は、検出器が動きを探す積極さを制御します。非常に揺れの大きい映像では値を上げます:

# requires --enable-libvidstab
ffmpeg -i input.mp4 -vf "vidstabdetect=shakiness=8:accuracy=15" -f null /dev/null
パラメータ 範囲 デフォルト 説明
shakiness 1〜10 5 検出する動きの範囲
accuracy 1〜15 15 検出精度(高いほど遅い)
result パス transforms.trf モーションファイルの出力先

パス2:smoothingcrop

# requires --enable-libvidstab
ffmpeg -i input.mp4 -vf "vidstabtransform=smoothing=30:crop=black" output.mp4
パラメータ デフォルト 説明
smoothing 15 時間的平滑化半径(フレーム数)。高いほど滑らかだが黒枠が広くなる
crop keep 安定化の境界処理: keep(前フレームの情報で縁を埋める/既定)または black(黒で塗りつぶす)
zoom 0 追加ズーム率(%)。正で拡大、負で縮小
optzoom 1 自動ズーム: 0=しない / 1=静的に最適化(既定) / 2=動的に最適化
interpol bilinear 補間方法: nolinearbilinearbicubic

crop の既定値は black ではなく keep です。 省略すると黒枠ではなく、前フレームの映像で縁が埋められます(残像状に見えます)。黒枠にしたい場合は明示的に crop=black を指定してください。本記事のコマンドはすべて明示指定しています。ffmpeg -h filter=vidstabtransform(default keep) と確認できます。


ズームで黒枠を隠す

手ブレ補正はカメラの動きを補償するためにフレームをシフトし、端に黒枠が現れます。zoomでスケールアップして黒枠を隠します:

# requires --enable-libvidstab
ffmpeg -i input.mp4 -vf "vidstabtransform=smoothing=20:zoom=5:crop=black" output.mp4

zoom=5で出力を5%拡大し、黒枠を覆います。トレードオフとして画像領域がわずかに縮小します(クロップイン効果)。


カスタムパスを使った完全なパイプライン

スクリプトや複数ファイルを処理する場合、モーションファイルのパスを明示的に指定します:

# requires --enable-libvidstab
ffmpeg -i input.mp4 -vf "vidstabdetect=result=/tmp/transforms.trf" -f null /dev/null
# requires --enable-libvidstab
ffmpeg -i input.mp4 -vf "vidstabtransform=input=/tmp/transforms.trf:smoothing=20" output.mp4

インストール

Ubuntu / Debian

標準リポジトリの ffmpeg パッケージで動きます。 PPAも自前ビルドも不要です。

sudo apt install ffmpeg

これは推測ではなく実測です。本サイトのCI(GitHub Actions の Ubuntu ランナー)で apt-get install ffmpeg を実行すると、apt が libvidstab1.1 を依存として同時に導入します。そのログの該当行がこれです。

Unpacking libvidstab1.1:amd64 (1.1.0-2build1) ...

そして入った FFmpeg 自身のビルド設定にも含まれています。ffmpeg -versionconfiguration: 行から連続する3項目を抜き出したものです。

--enable-libvidstab --enable-libvorbis --enable-libvpx

自分の環境で同じ確認をするならこうです。

ffmpeg -version | grep -o -- "--enable-libvidstab"

「Ubuntu の apt 版には libvidstab が入っていない」という説明を見かけますが、少なくとも 6.1.1-3ubuntu5 では誤りです。上で引用した --enable-libvidstab の行は Ubuntu 24.04 上の当サイト CI の実行ログそのままで、本記事のコマンドはそのビルドで再ビルドなしに全て通っています。最終的には ffmpeg -filters | grep vidstab で自分の環境を確認するのが確実です。

万一含まれていない古いビルドを使っている場合は、libvidstab-dev を入れた上で --enable-libvidstab を付けて自分でビルドするか、静的ビルド(BtbN/FFmpeg-Builds)を使ってください。sudo apt install libvidstab-dev だけでは解決しません — これはライブラリの開発用ヘッダを入れるだけで、ビルド済みのFFmpegバイナリには影響しないためです。

macOS(Homebrew)

brew install ffmpeg

HomebrewのFFmpegフォーミュラにはlibvidstabが含まれています。ffmpeg -filters | grep vidstabで確認してください。

Windows

gyan.dev/ffmpeg/buildsから“full”ビルドをダウンロードしてください — libvidstabが含まれています。


ビルドの確認方法

ffmpeg -filters 2>/dev/null | grep vidstab

出力にvidstabdetectvidstabtransformが表示されれば、手ブレ補正が使用可能です。


制限事項

  • libvidstabは中程度の手ブレに最適です。 極端な手ブレ(走りながら撮影した映像など)では、見た目のゆがみや補正不足が生じることがあります。
  • 2パスは必須です。 シングルパスの手ブレ補正はありません。
  • ズームで画像領域が縮小します。 補正量が多いほど黒枠を隠すために必要なズームが大きくなり、フレームがクロップされます。

関連記事


テスト環境: この記事のコマンドは2つのビルドで実行して検証しています — ffmpeg 8.1(gyan.dev full / Windows)と、CI 上の ffmpeg 6.1.1-3ubuntu5(Ubuntu 標準パッケージ、--enable-libvidstab 付き)。
一次ソース: ffmpeg.org/ffmpeg-filters.html#vidstabdetect / ffmpeg.org/ffmpeg-filters.html#vidstabtransform / trac.ffmpeg.org/wiki/Stabilize_video


よくある質問

vidstabdetect と vidstabtransform は両方必要?

はい、2 段階処理です。1 段目(detect)で動画を解析してモーションデータ transforms.trf を生成。2 段目(transform)でそのデータを元に手ブレを補正。

スマホで撮った揺れた動画も補正できる?

できます。vidstabdetect=shakiness=8:accuracy=15 まで上げると激しいブレも拾えます。ただし揺れが極端だと縁の破綻が目立つので、vidstabtransform=zoom=5:crop=black のように数%ズームして縁を隠すのが定番です。cropkeepblack の2択で、ピクセル数は取りません(縁を数値で切り落としたい場合は別の crop フィルタを後段に繋ぎます)。

vidstab で出力すると映像が小さくなる

補正で画面端に発生する破綻を避けるため、optzoom=1(既定)が自動的にやや拡大しています。拡大を止めるには zoom=0 ではなく optzoom=0 を指定してください(zoom の既定値はもともと 0 なので、zoom=0 を書いても何も変わりません)。拡大を止めると縁の処理は crop の設定次第になります。

リアルタイムで安定化したい

vidstab は事前解析が必須なのでリアルタイムは不可。リアルタイム手ブレ補正には deshake フィルタを使う(精度は劣るが 1 パスで済む)。

安定化後の動画を更に補正したい

可能ですが多重補正は劣化を増やす。理想は元動画から 1 度だけ vidstab を適用すること。すでに補正済み動画にもう一度かけたい場合は、shakiness=2 accuracy=5 のように軽めに。