基本コマンド

左上にテキストを表示する

ffmpeg -i input.mp4 -vf "drawtext=text='Hello World':x=10:y=10:fontsize=36:fontcolor=white" output.mp4

中央に表示する

ffmpeg -i input.mp4 \
  -vf "drawtext=text='CENTER':x=(w-text_w)/2:y=(h-text_h)/2:fontsize=48:fontcolor=white" \
  output.mp4

w・h は映像の幅と高さ、text_w・text_h は文字列の幅と高さです。(w-text_w)/2 にすると、文字が左右の真ん中に来ます。

主要パラメータ一覧

パラメータ 説明 例
text 表示するテキスト text='Hello'
fontfile フォントファイルのパス fontfile=/path/to/font.ttf
fontsize 文字の大きさ(ピクセル) fontsize=36
fontcolor 文字の色(色の名前かHEX) fontcolor=white / fontcolor=0xFFFFFF
x / y 表示する位置 x=10:y=10
shadowcolor 影の色 [email protected]
shadowx / shadowy 影をずらす量 shadowx=2:shadowy=2
box 文字の後ろにボックス(四角い背景)を付ける box=1
boxcolor ボックスの色 [email protected]
boxborderw ボックスの余白(パディング) boxborderw=5

フォントの指定

ffmpeg -i input.mp4 \
  -vf "drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='FFmpeg':fontsize=40:fontcolor=yellow" \
  output.mp4

日本語を表示するときは、日本語の文字が入ったフォントを指定してください。

ffmpeg -i input.mp4 \
  -vf "drawtext=fontfile=/path/to/NotoSansCJKjp-Regular.otf:text='日本語テキスト':fontsize=36:fontcolor=white" \
  output.mp4

テロップを、別に撮ったグリーンバックの素材と合成するときは、chromakey フィルタでグリーンバック合成する手順と組み合わせます。

影付きテキスト

ffmpeg -i input.mp4 \
  -vf "drawtext=text='Shadow Text':x=50:y=50:fontsize=40:fontcolor=white:shadowcolor=black:shadowx=3:shadowy=3" \
  output.mp4

背景ボックス付きテキスト

ffmpeg -i input.mp4 \
  -vf "drawtext=text='BOX TEXT':x=20:y=20:fontsize=36:fontcolor=white:box=1:[email protected]:boxborderw=8" \
  output.mp4

[email protected] は、不透明度60%の黒い背景です。背景がごちゃごちゃして文字が読みにくいときは、ボックスの代わりに、文字の後ろの部分をboxblur フィルタでぼかす方法もあります。ぼかすと文字が目立ちます。

タイムコードを表示する

ffmpeg -i input.mp4 \
  -vf "drawtext=text='%{pts\:hms}':x=w-text_w-10:y=h-text_h-10:fontsize=24:fontcolor=white:box=1:[email protected]" \
  output.mp4

%{pts\:hms} の部分に、HH:MM:SS.mmm 形式の時刻(タイムコード)が表示されます。'...' で囲んだ text の中のコロンは、オプションの区切りと区別するために \: と書きます(エスケープ)。

フレーム番号を表示する

ffmpeg -i input.mp4 \
  -vf "drawtext=text='Frame %{n}':x=10:y=10:fontsize=24:fontcolor=yellow" \
  output.mp4

スクロールテロップ(右から左へ流れるテキスト)

ffmpeg -i input.mp4 \
  -vf "drawtext=text='スクロールテキストのサンプルです':x=w-200*t:y=h-60:fontsize=32:fontcolor=white" \
  output.mp4

x=w-200*t にすると、文字は画面の右端から左へ、1秒に200pxずつ動きます。速さは係数(200)で変えます。

複数テキストを重ねる

ffmpeg -i input.mp4 \
  -vf "drawtext=text='Title':x=(w-text_w)/2:y=30:fontsize=48:fontcolor=white, \
       drawtext=text='Subtitle':x=(w-text_w)/2:y=90:fontsize=28:fontcolor=yellow" \
  output.mp4

drawtext をカンマでつなぐと、複数の文字を重ねて表示できます。

テキストファイルから読み込む

ffmpeg -i input.mp4 \
  -vf "drawtext=textfile=caption.txt:x=10:y=10:fontsize=28:fontcolor=white" \
  output.mp4

text= の代わりに textfile= を使うと、テキストファイルに書いた文字を表示できます。

位置指定の便利な変数

変数 意味
w 映像の幅
h 映像の高さ
text_w 描画テキストの幅
text_h 描画テキストの高さ
t 現在の時刻(秒)
n フレーム番号

注意点

  • drawtext を使うには、FFmpeg が libfreetype を有効にしてビルドされている必要があります(FFmpeg 6.1 以降は libharfbuzz も必要)。使えるかどうかは ffmpeg -h filter=drawtext で確かめられます。
  • text や textfile の文字は UTF-8 で書きます。日本語や中国語などを表示するには、その文字のグリフが入ったフォントが必要です。
  • 文字が映像の外にはみ出しても、はみ出た部分が切れるだけで、エラーにはなりません。
  • text='...' の中の : は \: と書きます。' を含む文字は、textfile= でファイルから読み込むのが確実です。

つまずきやすいポイント

  • 症状: 文字がまったく表示されない。 原因: text が空のままか、フォントが見つかっていません。対処: まず text='Hello World' のような簡単な文字列で試します。フォントを指定していないなら、fontfile= で実際にあるフォントファイルを指定します。Windowsのパスは、fontfile='C\:/Windows/Fonts/arial.ttf' のようにドライブ名のコロンを \: と書きます。'...' で囲むだけでは、コロンが区切りとして読まれてエラーになります。

  • 症状: : や ' を含む文字を表示しようとすると、パースエラー(書き方を読み取れないエラー)になるか、文字が崩れて表示される。 原因: drawtext はオプションの区切りにコロンを使い、フィルタ全体もクォートで囲みます。そのため、文字の中の記号が区切りと間違えられます。対処: text='...' の中のコロンは \: と書きます。シングルクォートを含む文字や記号の多い長い文章は、textfile=caption.txt:expansion=none のように別のファイルから読み込むと確実です。expansion=none を付けないと、ファイルの中の % と \ は特別な文字として読まれます。\ は消え、50% のような % があると文字が描画されません。

  • 症状: 日本語が豆腐(□)や空白になる。 原因: 日本語の文字の形(グリフ)が入っていないフォント(DejaVu Sans など)を指定しています。対処: Noto Sans CJK など、日本語・中国語・韓国語(CJK)に対応したフォントを fontfile= で指定します。フォントファイルに、表示したい文字のグリフが入っている必要があります。

  • 症状: スクロールテロップが途中で止まる、または速すぎる。 原因: x=w-200*t の係数が、映像の長さや幅に合っていません。対処: 係数(速さ)を 100〜300 くらいで調整します。テロップ全体が流れきるまでの時間は、およそ (w + text_w) / 係数 秒です。

よくある質問

Q. fontfile を指定せずに使えますか? A. FFmpegがfontconfigなしでビルドされていると、fontfile は必須です。fontconfig付きのビルドでも、設定ファイルが見つからない環境では Fontconfig error と出て、処理が止まることがあります。確実に動かすには、実際にあるフォントファイルを fontfile= で指定してください。フォント名で指定する font= もありますが、使えるフォントはパソコンの環境によって違います。

Q. テキストの背景に半透明の帯を付けたいです。 A. box=1:[email protected]:boxborderw=8 のように、box で始まるオプションを使います。@0.6 は不透明度(60%)、boxborderw は文字のまわりの余白です。

Q. 一定時間だけテキストを表示できますか? A. enable='between(t,2,5)' を加えると、2〜5 秒の間だけ表示されます。drawtext をカンマで複数つなげば、別々のタイミングで別々の文字を出せます。

Q. タイムコードの %{pts\\:hms} でエラーが出ます。 A. PowerShellやコマンドプロンプトでは、バックスラッシュがそのままFFmpegに渡ります。FFmpegは \\ を「\」という文字として読むので、続くコロンがオプションの区切りになり、Error parsing filterchain が出ます。上の例のように %{pts\:hms} と1つにしてください。bashやzshの "..." の中では \\ が \ になるので、\\: でも \: でも動きます。

Q. 描画後に -c:v copy でコピーできますか? A. できません。drawtext は映像の画素を書き換えるので、映像は必ず再エンコードされます。音声は -c:a copy でそのまま残せます。

関連フィルタ

  • drawbox — 四角形を描く
  • subtitles — SRTファイルの字幕を焼き込む
  • ass — ASS形式の字幕を焼き込む