
左が元映像、右が drawbox=x=760:y=600:w=520:h=360:[email protected]:t=6。座標とサイズがそのまま枠になります。
素材: Big Buck Bunny © Blender Foundation, CC BY 3.0
この記事でわかること
drawboxフィルタで矩形を描画するコマンド- 座標・サイズ・色・線幅・塗りつぶしの指定方法
drawgridフィルタでグリッドを重ねる方法- 動画解析・物体検出結果の可視化への応用
動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 13 件を検証スクリプトで実行し、全て成功しました(2026-09-06) 対象 OS: Windows / macOS / Linux
基本コマンド
赤い矩形を描画する(輪郭のみ)
ffmpeg -i input.mp4 \
-vf "drawbox=x=50:y=50:w=200:h=100:color=red:t=3" \
output.mp4
t=3 は線の幅(ピクセル)です。
塗りつぶし矩形
ffmpeg -i input.mp4 \
-vf "drawbox=x=50:y=50:w=200:h=100:[email protected]:t=fill" \
output.mp4
t=fill で塗りつぶし(color に透明度を指定可能)。矩形で囲った領域をそのまま隠したい場合は、塗りつぶしの代わりにboxblur フィルタでボックスブラーをかける方法も検討できます。
パラメータ詳細
| パラメータ | 説明 | 例 |
|---|---|---|
x |
左上X座標 | x=50 |
y |
左上Y座標 | y=50 |
w |
幅(iw で入力幅を使用可能) |
w=200 |
h |
高さ(ih で入力高さを使用可能) |
h=100 |
color |
色(名前またはHEX、@透明度 可) |
[email protected] |
t |
線幅(ピクセル)または fill |
t=3 / t=fill |
色の指定方法
# 色名で指定
ffmpeg -i input.mp4 -vf "drawbox=x=10:y=10:w=100:h=50:color=green:t=2" output.mp4
# HEXで指定
ffmpeg -i input.mp4 -vf "drawbox=x=10:y=10:w=100:h=50:color=0xFF0000:t=2" output.mp4
# 半透明で指定
ffmpeg -i input.mp4 -vf "drawbox=x=10:y=10:w=100:h=50:[email protected]:t=fill" output.mp4
映像全体を囲む枠を描く
ffmpeg -i input.mp4 \
-vf "drawbox=x=0:y=0:w=iw:h=ih:color=yellow:t=5" \
output.mp4
iw(入力幅)・ih(入力高さ)を使って映像サイズに合わせた枠を描けます。被写体を切り抜いて別背景と合成したい場合は、枠で囲うのではなくchromakey フィルタでグリーンバック合成するアプローチが向いています。
中央に十字線を描く
ffmpeg -i input.mp4 \
-vf "drawbox=x=iw/2-1:y=0:w=2:h=ih:color=white:t=fill, \
drawbox=x=0:y=ih/2-1:w=iw:h=2:color=white:t=fill" \
output.mp4
横線と縦線を組み合わせて十字線を作ります。
複数の矩形を描く
ffmpeg -i input.mp4 \
-vf "drawbox=x=20:y=20:w=150:h=80:color=red:t=3, \
drawbox=x=200:y=100:w=120:h=60:color=blue:t=3" \
output.mp4
カンマで複数の drawbox を連結できます。
drawgrid フィルタでグリッドを重ねる
drawgrid は等間隔のグリッドを描画します。
ffmpeg -i input.mp4 \
-vf "drawgrid=width=100:height=100:thickness=1:[email protected]" \
output.mp4
| パラメータ | 説明 |
|---|---|
width |
グリッドのセル幅 |
height |
グリッドのセル高さ |
thickness |
グリッド線の太さ |
color |
グリッド線の色 |
三分割構図ガイドラインを描く
ffmpeg -i input.mp4 \
-vf "drawgrid=width=iw/3:height=ih/3:thickness=1:[email protected]" \
output.mp4
撮影構図確認やポストプロダクションのガイドラインとして利用できます。
drawtext と組み合わせてラベル付きバウンディングボックス
ffmpeg -i input.mp4 \
-vf "drawbox=x=100:y=80:w=200:h=120:color=lime:t=2, \
drawtext=text='Object':x=102:y=60:fontsize=20:fontcolor=lime" \
output.mp4
特定の時間範囲だけ表示する
FFmpeg 式を使って時間条件を設定できます。
ffmpeg -i input.mp4 \
-vf "drawbox=x=50:y=50:w=200:h=100:color=red:t=3:enable='between(t,2,5)'" \
output.mp4
enable='between(t,2,5)' で 2〜5 秒の間だけ表示します。
注意点
x・y・w・hはiw・ih(入力サイズ)などの FFmpeg 式が使えます。colorに透明度(@値)を付けると半透明になりますが、t=fillと組み合わせて使います。drawboxは-vfフィルタチェインで複数連結できます(カンマ区切り)。
実測: 処理時間とサイズ
計測したのは次のコマンドです。1080p/30fps・2分の素材に、赤・黄・シアンの矩形を3つ重ねています。
ffmpeg -i input.mp4 -vf drawbox=x=100:y=100:w=300:h=200:color=red:t=4,drawbox=x=500:y=300:w=300:h=200:color=yellow:t=4,drawbox=x=900:y=500:w=300:h=200:color=cyan:t=4 -c:v libx264 -crf 23 -preset medium -an output.mp4
| 項目 | 実測値 |
|---|---|
| 所要時間 | 31.68 秒(実時間の 3.79 倍速) |
| 出力サイズ | 87.94 MB |
| フィルタなし再エンコード比 | +1.9% |
計測環境: Intel Core i9-14900KF(32スレッド)/ FFmpeg 8.1(gyan.dev full build)/ 素材 Big Buck Bunny 1920x1080・30fps・120秒・351.4MB(© Blender Foundation, CC BY 3.0)/ 計測日 2026-09-05・逐次実行。生データはデータセットで公開しています。
この数字の読み方
同じ素材をフィルタを一切かけずに再エンコードしただけで 27.97 秒かかります。31.68 秒のうち、大部分は drawbox ではなく H.264 エンコードそのものの時間です。drawbox が書き換えるのは指定した矩形の枠線(t=4)の画素だけなので、フレーム全体を舐めるフィルタとは負荷の桁が違います。同じ計測では boxblur が 59.37 秒、色調補正が 53.26 秒、curves が 42.01 秒でした。枠を1つ増やしても、この構図は変わりません。
サイズは 87.94 MB で、フィルタなしの再エンコードより +1.9% 大きくなりました。「塗りつぶしで画面が単純になるぶんサイズが下がることもある」と書かれることがありますが、少なくともこの計測(枠線 t=4 を3本)では逆方向です。赤・黄・シアンのくっきりした境界は、エンコーダにとっては新規の高コントラストなエッジであり、そこにビットを割く必要があるためです。
そして、この記事で一番効いてくるのは次の対比です。同じ計測環境で映像を再エンコードしない操作 —— ストリームの入れ替え 0.41 秒、moov atom の移動 0.49 秒、音声フェード 1.03 秒 —— に対して、drawbox は 31.68 秒。drawbox は画素そのものを書き換えるので -c copy は原理的に使えず、必ず再エンコード側のコストを払います。「枠を1本足すだけ」でも、コンテナ操作とは別世界の処理です。
だからこそ、座標合わせの段階では -t 10 で先頭10秒だけ書き出して位置を確認し、確定してから全体に適用してください。試行錯誤のたびに 31.68 秒を払う理由はありません。
つまずきやすいポイント
-
症状: 半透明の塗りつぶしにしたのに不透明な単色になる。 原因:
[email protected]を指定してもt=fillを付け忘れている、または線描画(t=数値)のままになっている。対処: 塗りつぶしにはt=fillが必須です。[email protected]:t=fillのように両方を指定します。 -
症状: 枠が映像からはみ出して見えない、または位置がずれる。 原因:
x・yに固定値を使い、解像度の違う素材に流用している。対処:iw・ihを使った相対指定にします。例えば全体枠はx=0:y=0:w=iw:h=ih、中央十字はx=iw/2-1のように式で書くと解像度非依存になります。 -
症状: 線が思ったより太い/細い。 原因:
tを線幅とフレームサイズの比で考えていない。対処: 1080p ではt=3〜t=5程度が見やすい目安です。4K では同じ太さに見せるには倍程度(t=8前後)に増やします。 -
症状:
enable='between(t,2,5)'が効かずずっと表示される。 原因: クォートが外れてシェルに解釈されている。対処: フィルタ全体を"..."で囲み、式部分は'...'で囲んだ二重クォート構造を保ちます。
よくある質問
Q. drawbox で映像を再エンコードせずに済みますか。
A. できません。画素を書き換えるため映像は再エンコードされます。音声は -c:a copy で保持できます。座標確認だけなら -t 10 で短い区間を書き出して位置決めすると無駄が減ります。
Q. 矩形を複数描くと処理が重くなりますか。
A. 数個程度であれば drawbox 自体の負荷はごく軽く、処理時間の大半は再エンコードが占めます。カンマで連結した分だけ順に処理されます。
Q. バウンディングボックスにラベルを付けたいです。
A. drawbox と drawtext をカンマで連結します。本記事の「drawtext と組み合わせてラベル付きバウンディングボックス」の例のように、ボックスの少し上に drawtext を置くと見やすくなります。
Q. グリッドの線が太すぎます。
A. drawgrid の thickness=1 が最小です。色を [email protected] のように半透明にすると、線幅を変えずに主張を弱められます。
Q. 塗りつぶしで領域を完全に隠せますか。
A. color=black:t=fill(不透明度なし)なら下の映像が見えなくなります。内容を「ぼかして隠す」場合は塗りつぶしより boxblur が自然です。