基本コマンド
左上にテキストを表示する
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 でそのまま残せます。