drawbox フィルタの適用前後の比較。左が元の映像、右は指定した座標(金属の手のまわり)に赤い矩形の枠が描画された状態

左が元の映像、右が drawbox=x=1020:y=530:w=140:h=220:[email protected]:t=6 をかけた出力です。指定した位置と大きさのとおりに枠が描かれます。

素材: Tears of Steel (CC) Blender Foundation | mango.blender.org、CC BY 3.0。映画の1フレームを切り出し、フィルターで加工しています。

基本コマンド

赤い矩形を描画する(輪郭のみ)

ffmpeg -i input.mp4 \
  -vf "drawbox=x=50:y=50:w=200:h=100:color=red:t=3" \
  output.mp4

x・y が枠の左上の位置、w・h が幅と高さです。t=3 は線の太さ(ピクセル)です。

塗りつぶし矩形

ffmpeg -i input.mp4 \
  -vf "drawbox=x=50:y=50:w=200:h=100:[email protected]:t=fill" \
  output.mp4

t=fill にすると、四角の中が塗りつぶされます。[email protected] のように @ の後ろに不透明度を付けると、半透明になります。囲った部分を、塗りつぶさずにぼかして隠したいときは、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

塗りつぶした細長い四角を、縦と横に1本ずつ描いて十字線にしています。

複数の矩形を描く

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

マス目の幅と高さを映像の 3 分の 1 にして、画面を縦横 3 つずつに分けています。構図の確認や、編集作業の目安に使えます。

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

物体検出の結果などで、対象を囲む枠をバウンディングボックスと呼びます。drawtext で枠の少し上に名前を書くと、何を囲んだ枠かがわかります。

特定の時間範囲だけ表示する

enable に時間の条件を書くと、その間だけ枠を表示できます。

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 秒の間だけ表示します。式の中の t は再生時刻(秒)です。

注意点

  • x・y・w・h には、iw・ih(入力の幅と高さ)を使った式を書けます。
  • color に @値 を付けると半透明になります。塗りつぶし(t=fill)にも、枠線にも使えます。

実測: 処理時間とサイズ

計測したコマンドは次のとおりです。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・1つずつ順に実行。数値はデータセットで公開しています。

この数字の読み方

同じ素材を、フィルタをかけずに再エンコードするだけで 27.97 秒かかります。31.68 秒の大部分は、drawbox ではなく H.264 のエンコードの時間です。drawbox が書き換えるのは、枠線(t=4)の部分の画素だけなので、処理はごく軽く済みます。同じ計測で、boxblur は 59.37 秒、色調補正(colorbalance + eq)は 53.29 秒、curves は 42.01 秒でした。boxblur は周りの画素を平均します。colorbalance と curves は RGB で処理するので、各フレームを RGB に変換して戻す手間がかかります。どちらも出力が 4:4:4(yuv444p)になり、4:2:0 よりエンコードに時間がかかりました。枠を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秒だけを書き出して確認します。位置が決まってから、動画全体にかけてください。

つまずきやすいポイント

  • 半透明で塗りつぶしたいのに、枠線しか描かれない:t=fill を付け忘れているか、線(t=数値)のままになっています。t を指定しないと、太さ 3 ピクセルの枠線になります。[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)' を付けたら No such filter: '2' のエラーになる:クォートが外れて、式の中のカンマでフィルタが区切られています。フィルタ全体を "..." で囲み、式の部分を '...' で囲んでください。

よくある質問

Q. drawbox で映像を再エンコードせずに済みますか。 A. できません。画素を書き換えるので、映像は再エンコードされます。音声は -c:a copy でそのまま残せます。位置を確かめるだけなら、-t 10 で短い区間だけ書き出すと早く済みます。

Q. 矩形を複数描くと処理が重くなりますか。 A. 数個なら、drawbox 自体の負荷はごく軽く、処理時間の大半は再エンコードです。カンマでつないだ順に処理されます。

Q. バウンディングボックスにラベルを付けたいです。 A. drawbox と drawtext をカンマでつなぎます。上の「drawtext と組み合わせてラベル付きバウンディングボックス」の例のように、文字を枠の少し上に置くと見やすくなります。

Q. グリッドの線が太すぎます。 A. drawgrid の線の太さは thickness=1 が最小です。[email protected] のように半透明にすると、太さはそのままで目立たなくなります。

Q. 塗りつぶしで領域を完全に隠せますか。 A. color=black:t=fill のように、@ で不透明度を付けずに指定すれば、下の映像は見えなくなります。ぼかして隠したいときは、塗りつぶしより boxblur のほうが自然に見えます。

関連フィルタ