この記事の結論
ffmpegのdrawtextが使えないのは、文字を描く部品なしで作られた版だからでした。2026年9月4日、Homebrewのffmpeg 8.1.1で数えるとdrawtextは0件。字幕はffmpeg-fullとASSで焼いています。
目次7項目
【無料・メールだけ】Claude Code 2daysセミナー(第二の脳構築講座)の次回開催の案内を受け取る →
ffmpeg の drawtext が No such filter になるのは、文字を描く部品の無い版だからです。僕は字幕を ffmpeg-full で焼き、テロップは別の道具で描く形にしました。2026年9月4日には、Homebrew の ffmpeg 8.1.1 で drawtext が0件だったのを確かめています。
確かめ方のコマンド、ffmpeg-full と ASS で字幕を焼いた手順、文字を CapCut 側に任せた判断まで、記録どおりに書きます。
ffmpeg drawtext が No such filter になるのは、文字の部品なしで作られた版だから
No such filter: 'drawtext' は、「その名前のフィルタがこの ffmpeg に無い」という意味です。書き方の誤りではなく、作られたときに drawtext が組み込まれていない版だと、この文言が出ます。
ここでいう drawtext とは、動画の上に文字列を描く ffmpeg のフィルタです。公式の文書では、文字の描画に libfreetype というフォントの部品を使うと書かれています。
組み込む条件も公式にあります。drawtext は --enable-libfreetype と --enable-libharfbuzz を付けて作った版でだけ使えます。
フォントの代わりを自動で探す機能には、--enable-libfontconfig も要ります。
字幕のファイルを焼き込む subtitles と ass も、同じ理由で無いことがあります。こちらは libass という字幕の部品が要り、subtitles は --enable-libass を付けて作った版だけで使えます。
| フィルタ | 何をするか(公式の説明) | 作るときに要るもの |
|---|---|---|
| drawtext | 文字列やファイルの文字を動画の上に描く | libfreetype と libharfbuzz |
| subtitles | 字幕ファイルを libass で動画の上に描く | libass |
| ass | subtitles と同じ。libavcodec と libavformat が無くても動く | subtitles と同じく libass で描く |
僕の会社で当たったのは、この3つがそろって無い版でした。文字を焼くつもりなら、どれが入っているかを最初に数えておくと迷いません。
Homebrew の ffmpeg と ffmpeg-full の違い:依存に freetype と libass があるか
Homebrew には ffmpeg と ffmpeg-full の2つがあります。2026年11月2日に formulae のページで見ると、どちらも版は 9.0.2 でした。
違いは依存の一覧です。ffmpeg の依存には freetype も libass も載っていません。ffmpeg-full の依存は47個で、freetype・harfbuzz・fontconfig・libass が入っています。
もう1つ、ffmpeg-full は keg-only です。ページには、別の formula の別版なので keg-only だと書かれています。
keg-only とは、入れても ffmpeg という名前の呼び出し先が置き換わらない入れ方です。
つまり ffmpeg-full を入れただけでは、ターミナルで ffmpeg と打つと元の版が動きます。ここを知らないと「入れたのに直らない」と見えます。
drawtext があるかを確かめて直す手順(ffmpeg -filters と ffmpeg-full)
手順は、数える・原因を見る・道を選ぶの3段です。どれも1行のコマンドで済みます。
- 版を見る:
ffmpeg -version | head -1 - drawtext を数える:
ffmpeg -hide_banner -filters | grep -c drawtext(0 なら入っていない) - 字幕の2つも見る:
ffmpeg -hide_banner -filters | grep -E 'subtitles|ass' - 作り方を見る:
ffmpeg -hide_banner -buildconf | grep -E 'freetype|harfbuzz|libass' - 0件なら、ffmpeg-full を入れる(下の H3)か、文字を別の道具で描く(次の章)
公式の説明では、-filters は使えるフィルタの一覧を出す指定、-buildconf はビルド時の設定を1行ずつ出す指定です。-hide_banner は最初の長い表示を消すだけです。
ffmpeg-full を入れて、フルパスで呼ぶ
ffmpeg-full は brew install ffmpeg-full で入ります。入れた後は、元の ffmpeg と並んで置かれます。
brew install ffmpeg-full
/opt/homebrew/opt/ffmpeg-full/bin/ffmpeg -hide_banner -filters | grep -c drawtext
僕の Mac では、置き場所は /opt/homebrew/opt/ffmpeg-full/bin でした。毎回このパスで呼ぶか、作業の前に PATH の先頭へ足してから実行します。
僕の記録にあるのは、ffmpeg-full での字幕の焼き込みまでです。ffmpeg-full の drawtext を使った記録はありません。
依存に freetype と harfbuzz があるので使えると読んでいますが、上の行が1以上になるかを先に見てください。
2026年9月4日、Homebrew の ffmpeg 8.1.1 で drawtext は0件だった
2026年9月4日、CapCut の自動編集に使う環境を実測したときに数えました。Homebrew の ffmpeg 8.1.1 で ffmpeg -filters | grep drawtext を実行すると、0行でした。
社内の作業記録には、症状を「ffmpeg で字幕を焼き込もうとして No such filter: 'drawtext'」と残しています。同じ日の環境の記録でも、ffmpeg は「8.1.1(drawtext フィルタ無し)」です。
対処は ffmpeg の入れ替えではなく、文字を CapCut の字幕として下書きのデータに書く形です。僕の会社の自動編集は、もともとそう設計してあります。記録の対処の行は「ffmpeg に文字を書かせない」です。
下書きを作る仕組みの全体はCapCutの下書きをClaude Codeで作る実録に書いています。この記事はその裏側の話です。
9月7日の家族の旅行動画でも、テロップ42枚は CapCut の字幕トラックに入れました。同じ記録には、この Mac の ffmpeg 8.1.1 に drawtext・subtitles・ass が無いこともまとめてあります。
6月18日:テロップは画像で重ね、字幕は ffmpeg-full に任せた
文字の部品が無いことに最初に当たったのは、2026年6月18日です。社内のリール編集のメモにはdrawtext 非搭載(freetype 無しビルド)と残っており、テロップは画像で作って重ねる形に切り替えました。
Python の画像の部品(PIL)で文字入りの PNG を作り、ffmpeg の overlay で重ねる形です。静止画を重ねるときは、入力に -loop 1 -framerate 30 が要ることも記録しました。
付けないと画像が1フレームだけになり、フェードを付けたテロップが最後まで消えたままになります。第1回の試作で、実際にこれが起きました。
同じ6月18日、自分が話す縦型の短い動画に字幕を焼いたときは、標準の ffmpeg に libass が無いと分かりました。
そこで ffmpeg-full を入れ、PATH の先頭に置いて書き出しています。字幕は自作の SRT で18枚でした。
7月14日:ASS を46キュー直書きして、最後に焼いた
2026年7月14日、縦の自撮り動画を特番風に仕上げたときは、字幕を ASS ファイルに直接書きました。キューは46個です。
書体は、本文をヒラギノ角ゴ W7 の白、引用をヒラギノ明朝 W6 の金に分けました。縦の画面で操作ボタンにかぶらないよう、下からの余白(MarginV)は470にしています。
書き出しは2段で、1段目は字幕なしで作り、2段目の仕上げで ass を最後に焼きました。2段目は ffmpeg-full をフルパスで呼んでいます。焼く部分の形は次のとおりです(ファイル名は例)。
/opt/homebrew/opt/ffmpeg-full/bin/ffmpeg -i base.mp4 -vf "ass=subs.ass" -c:a copy out.mp4
記録には、字幕のスタイルは ASS に直接書き、force_style は使わないと残しています。公式では、force_style は字幕の既定のスタイルを上書きする指定です。
本文と引用で書体を分けるなら、ファイルに書く方が素直だと僕は考えています。
再発防止:文字をどこで描くかを先に決め、確認を手順書に入れた
再発を防ぐために僕の会社でやったのは2つです。文字を描く道具を決めておき、drawtext の確認を環境の手順書に入れました。
環境構築の手順書には、ffmpeg の確認の行に「8.1.1(drawtext フィルタ無し)」と書きました。
困ったときの早見表にも ffmpeg -filters | grep drawtext の行があります。答えは「文字は CapCut 側で描く設計なので不要」です。
サムネイルの文字入れも、CapCut か別の道具でやると決めてあります。文字の入れ方を並べると、次のようになります。
| 文字の入れ方 | 必要なもの | 僕の会社で使った場面 |
|---|---|---|
| drawtext | freetype と harfbuzz 入りの ffmpeg | 使っていない(標準の版に無かった) |
| subtitles・ass で焼く | libass 入りの ffmpeg(ffmpeg-full) | 字幕の焼き込み(6月18日・7月14日) |
| PIL で PNG を作り overlay | Python と標準の ffmpeg | 大きなテロップ(6月18日) |
| CapCut の字幕として書く | CapCut の下書きを作る仕組み | 自動編集の下書き(9月4日以降) |
記録の上では、4つをそれぞれ別の場面で使っています。後から文字を直したい動画は CapCut の字幕、焼いて納める字幕は ASS と分けるのが分かりやすいと僕は考えています。
Claude Code に動画の作業を任せるときも、ここを先に伝えています。Claude Code が読むメモには、Homebrew 標準の ffmpeg は libass 無しなので ffmpeg-full を使う、と書いてあります。
同じ手順書では、字幕の文字起こしに使う mlx-whisper の前提も確認の行に入れました。Mac の種類で入らない場合がある点は、mlx-whisper が Intel Mac で入らない理由と確認手順にまとめています。
業務で使うときの注意:版の違い・パス・フォントの扱い
1つ目は版の違いです。僕の記録は 8.1.1 の時点のもので、formulae のページは2026年11月2日に 9.0.2 でした。Mac ごとに、最初の手順のコマンドで数え直してください。
2つ目はパスです。ffmpeg-full は keg-only なので、スクリプトに ffmpeg とだけ書くと元の版が動くことがあります。仕上げのスクリプトにはフルパスを書いておきます。
3つ目はフォントです。動画に焼いた文字は後から差し替えられないので、商用で使える書体かを先に確かめます。僕の会社のテロップでは、商用で使える OFL の毛筆書体を選んだ記録があります。
チームで使うなら、確認のコマンドを手順書の最初に置くのがおすすめです。
Claude Code の困りごとを並べたClaude Codeのエラー・困りごと一覧でも、この症状は表の1行で扱っています。
文字の動きまでコードで組みたいなら、Remotionで動画を作る実録の方法もあります。
僕なら、焼き込みの字幕は ffmpeg-full、動く文字は別の道具と分けるところから始めます。
よくある質問
Homebrewのffmpegを入れ直せばdrawtextは使えますか?
入れ直すだけでは変わらないと僕は考えています。2026年11月2日時点のformulaeページでは、ffmpeg 9.0.2の依存の一覧にfreetypeがありません。drawtextが要るなら、依存にfreetypeとharfbuzzがあるffmpeg-fullを入れて、フィルタの一覧で確かめる方が確実です。
ffmpeg-fullを入れたのに、まだdrawtextが無いと言われます。
ffmpeg-fullはkeg-onlyなので、ffmpegと打つと元の版が動いたままです。僕の会社では/opt/homebrew/opt/ffmpeg-full/bin/ffmpegをフルパスで呼ぶか、そのフォルダをPATHの先頭に足してから実行しています。
subtitlesフィルタとassフィルタは何が違いますか?
FFmpegの公式文書では、assはsubtitlesと同じで、libavcodecとlibavformatが無くても動くこと、ASS形式の字幕ファイル専用であることの2点が違うとされています。どちらもlibassで字幕を描きます。僕の会社ではASSファイルを自分で書き、assで最後に焼いています。
