この記事でわかること
drawtextフィルタで動画にテキストを描画するコマンド- フォント・サイズ・色・位置の指定方法
- タイムコードや動的テキストの表示方法
- スクロールテロップの作り方
テスト済みバージョン: FFmpeg 6.1(検証スクリプトで実 FFmpeg 実行確認)
対象 OS: Windows / macOS / Linux
基本コマンド
左上にテキストを表示する
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 はテキストの幅・高さです。
主要パラメータ一覧
| パラメータ | 説明 | 例 |
|---|---|---|
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 | 影の色 | shadowcolor=black@0.5 |
shadowx / shadowy | 影のオフセット | shadowx=2:shadowy=2 |
box | 背景ボックス | box=1 |
boxcolor | 背景ボックスの色 | boxcolor=black@0.5 |
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
日本語テキストを表示する場合は日本語対応フォントを指定してください。テロップを別撮りのグリーンバック素材に乗せて合成する場合は、chromakey フィルタでグリーンバック合成する手順と組み合わせます。
ffmpeg -i input.mp4 \
-vf "drawtext=fontfile=/path/to/NotoSansCJKjp-Regular.otf:text='日本語テキスト':fontsize=36:fontcolor=white" \
output.mp4
影付きテキスト
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:boxcolor=black@0.6:boxborderw=8" \
output.mp4
boxcolor=black@0.6 は 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:boxcolor=black@0.5" \
output.mp4
%{pts\\:hms} は HH:MM:SS.mmm 形式のタイムコードを表示します。シェルでのエスケープに注意してください(\\: が必要)。
フレーム番号を表示する
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 で時間 t とともに左方向に移動します。速度は係数(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は libfreetype が必要です。通常の FFmpeg ビルドには含まれています。- 日本語・中国語などの多バイト文字は UTF-8 でエンコードされたフォントファイルが必要です。
- テキストが映像外にはみ出しても自動的にクリップされます(エラーにはなりません)。
- シェルでの特殊文字のエスケープに注意してください(
:は\\:、'は'\''など)。
つまずきやすいポイント
-
症状: 文字が一切描画されない。 原因:
textを空のまま実行している、またはフォントが見つからない。対処: まずtext='Hello World'のような確実な文字列で試し、フォント未指定ならfontfile=で実在するフォントを指定します。コロンやスペースを含むパスは'...'で囲みます。 -
症状:
:や'を含む文字を表示するとパースエラーになる。 原因:drawtextのオプション区切りはコロン、フィルタ全体はクォートで囲むため、本文中の特殊文字が誤解釈される。対処: コロンは\\:、シングルクォートは'\''のようにエスケープします。複雑な文章はtextfile=で外部ファイルから読み込むと安全です。 -
症状: 日本語が豆腐(□)や空白で表示される。 原因: グリフを持たないフォント(DejaVu Sans など)を指定している。対処: Noto Sans CJK など CJK 対応フォントを
fontfile=で指定します。フォントファイル自体が UTF-8 のテキストを描画できる必要があります。 -
症状: スクロールテロップが途中で止まる、または速すぎる。 原因:
x=w-200*tの係数が映像の長さや幅に合っていない。対処: 係数(速度)を100〜300程度で調整し、テロップ全体が流れ切るまでの時間を計算します(おおよそ(w + text_w) / 係数秒)。
よくある質問
Q. fontfile を指定せずに使えますか。
A. ビルドや OS によっては既定フォントが見つからずエラーになります。確実に動かすには実在する fontfile= を指定するのが安全です。フォント名で指定したい場合は font= も使えますが、利用可能なフォントは環境に依存します。
Q. テキストの背景に半透明の帯を付けたいです。
A. box=1:boxcolor=black@0.6:boxborderw=8 のように box 系オプションを使います。@0.6 が不透明度(60%)、boxborderw が文字周囲の余白です。
Q. 一定時間だけテキストを表示できますか。
A. enable='between(t,2,5)' を追加すると 2〜5 秒の間だけ描画されます。複数の drawtext をカンマで連結すれば、別々のタイミングで別々のテキストを出せます。
Q. タイムコードの %{pts\\:hms} でエラーが出ます。
A. シェルでバックスラッシュが消費されるのが原因です。本記事の例のように \\: と二重にするか、フィルタ式を '...' ではなくファイルやスクリプト経由で渡してエスケープを確実にします。
Q. 描画後に -c:v copy でコピーできますか。
A. できません。drawtext は画素を書き換えるため映像ストリームは必ず再エンコードされます。音声は -c:a copy でそのまま残せます。
関連フィルタ
関連リソース
よく使うオプション・フィルタ・コーデック設定をまとめた PDF チートシートです。手元に置いておくと調べる時間を短縮できます。