FFmpegで字幕を加える方法は、映像に文字を描く「焼き込み」と、字幕トラックを追加する「埋め込み」です。常に文字を見せたい場合は焼き込み、表示の切り替えや言語選択が必要なら、配布先が対応する埋め込みを選びます。
焼き込みでは映像を再エンコードします。埋め込みでは映像・音声をコピーできる場合に再エンコードを省けますが、字幕トラックを再生先が扱えるかは別に確認が必要です。どちらも元動画とSRTを残して、別名の出力で試します。
以下の旧画像・1280×720のサイズ表は2026年9月29日の実施記録、360コマやCP932の補足は10月2日の記録です。10月3日の今回のテストは別の640×360・12秒の生成入力で、結果を後半に分けて示しています。使用版はFFmpeg 9.0.2(gyan.dev full build)です。
焼き込みと埋め込みを選ぶ
| 目的 | 選ぶ方法・条件 |
|---|---|
| 文字を映像に常に表示する | subtitlesフィルターで焼き込む。後から字幕だけ消せない |
| 字幕を表示・非表示にする | mov_textなどのトラックを追加し、対応するプレーヤーで表示を確認する |
| 複数言語や後の修正を残す | 字幕を別トラック/別ファイルで保管し、必要な言語を明示して選ぶ |
| 元の映像を再圧縮したくない | 埋め込みと-c:v copyを検討。出力コンテナと映像コーデックの互換性を確認する |
subtitlesフィルターが使えるか確認する
ffmpeg -version
ffmpeg -filters
ffmpeg -h filter=subtitlessubtitlesにはlibassを組み込んだFFmpegが必要です。公式のフィルター仕様を確認し、一覧やヘルプにsubtitlesがあるかを確かめてから使います。「No such filter」などで止まる場合は、SRTを何度も直す前に実行したFFmpegのビルドを確認してください。
入力ファイルを準備する
以下のコマンド例は、動画と出力先を置く作業フォルダーで PowerShell を開いて実行します。
入力動画とSRTを残し、出力ファイル名が既存ファイルと重ならないようにします。以下は8bit SDRの再生用コピーの例です。HDR・10bit・透過・色の保持には、その用途に合う形式と画質設定を別に検討します。
以下の例は-nで既存出力への上書きを止めます。停止した場合は別の未使用の出力名に変えて実行します。FFmpegがPATHから実行できることを前提にしています。
基本コマンド記事で sample.mp4 を生成し、SRT記事の3つの字幕例を sub_utf8.srt としてUTF-8で保存すると、個人の素材を使わずに試せます。
字幕を焼き込む
ffmpeg -n -i sample.mp4 -vf "subtitles=sub_utf8.srt" -map 0:v:0 -map "0:a:0?" -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy burned.mp4-vf の subtitles で字幕を映像に描き込み、音声は -c:a copy でそのまま写します。

2行の字幕も、SRT に書いたとおり2行で表示されました。

日本語のフォント
2026年9月29日の既存ログでは、フォント未指定でArialを選び、日本語の文字が無いため別のフォントに切り替えていました。環境によって同じフォントが選ばれるとは限りません。
fontselect: (Arial, 400, 0) -> ArialMT, 0, ArialMT
Glyph 0x3053 not found, selecting one more font for (Arial, 400, 0)
fontselect: (Arial, 400, 0) -> YuGothicUI-Semibold, 2, YuGothicUI-Semiboldフォントや大きさを決めたいときは、force_style で指定します。
ffmpeg -n -i sample.mp4 -vf "subtitles=sub_utf8.srt:force_style='FontName=Yu Gothic UI,FontSize=28,Outline=2'" -map 0:v:0 -map "0:a:0?" -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy styled.mp4
このときのログでは、指定どおり YuGothicUI-Regular が選ばれていました。
Windowsでフルパスを書くとき
字幕のファイルをフルパスで書くと、ドライブの「:」が区切りと見なされてエラーになりました。
ffmpeg -n -i sample.mp4 -vf "subtitles=C:/demo/ffmpeg/sub_utf8.srt" -f null -Unable to parse "original_size" option value "/demo/ffmpeg/sub_utf8.srt" as image size「:」の前に「\」を付け、パス全体を ‘ で囲むと通りました。
ffmpeg -n -i sample.mp4 -vf "subtitles='C\:/demo/ffmpeg/sub_utf8.srt'" -map 0:v:0 -map "0:a:0?" -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy burned.mp4いちばん簡単なのは、字幕のファイルと同じフォルダーで ffmpeg を実行して、ファイル名だけを書く方法です。
Shift_JISの字幕で止まるとき
今回の日本語環境でCP932(エディターではShift_JIS/ANSI表記の場合あり)で保存したSRT を焼き込むと、次のエラーで止まり、処理は完了しませんでした。失敗時の出力が残っている可能性もあるため、完成した動画として使いません。
Invalid UTF-8 in decoded subtitles text; maybe missing -sub_charenc option
Error decoding: Invalid data found when processing input (ignored)
Error initializing filters文字コードを charenc で伝えると、正しく焼き込めました。
ffmpeg -n -i sample.mp4 -vf "subtitles=sub_sjis.srt:charenc=CP932" -map 0:v:0 -map "0:a:0?" -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy burned.mp4字幕を UTF-8 で保存し直す方法もあります。
SRT の文字コードについては、SRT字幕ファイルの書き方と文字コードで紹介しています。
字幕を埋め込む(切り替えできる字幕)
MP4に入れる
ffmpeg -n -i sample.mp4 -i sub_utf8.srt -map 0:v:0 -map "0:a:0?" -map 1:s:0 -c:v copy -c:a copy -c:s mov_text -metadata:s:s:0 language=jpn soft.mp4このFFmpegの例でMP4へ追加するSRTはmov_textへ変換します。映像・音声はMP4にコピーできる形式であることが前提です。入力が複数トラックなら、この例は最初の映像・最初の音声・外部SRTだけを選びます。既存の全字幕・添付・追加の音声を保持する指定ではありません。
-c:s mov_text を付けずに実行すると、次のエラーになりました。
Could not find tag for codec subrip in stream #2, codec not currently supported in containerできたファイルを ffprobe で見ると、字幕が3本目のトラックとして入っていました。
ffprobe -v error -show_entries stream=index,codec_type,codec_name:stream_tags=language -of compact soft.mp4stream|index=0|codec_name=h264|codec_type=video|tag:language=und
stream|index=1|codec_name=aac|codec_type=audio|tag:language=und
stream|index=2|codec_name=mov_text|codec_type=subtitle|tag:language=jpnMKVに入れる
ffmpeg -n -i sample.mp4 -i sub_utf8.srt -map 0:v:0 -map "0:a:0?" -map 1:s:0 -c:v copy -c:a copy -c:s srt -metadata:s:s:0 language=jpn soft.mkvMKV なら、字幕は SRT(subrip)のまま入りました。
埋め込んだ字幕を取り出す
ffmpeg -n -i soft.mkv -map 0:s:0 extracted.srt既存の測定では、取り出したSRTの時刻と本文は元の字幕と一致しました。改行コードや書式のバイト単位の一致を意味するものではありません。
Shift_JISの字幕を埋め込む場合
焼き込みの charenc は字幕フィルターの指定なので、別の入力として字幕を埋め込むときには使いません。
CP932で保存した sub_sjis.srt を読み込む場合は、字幕の -i より前に -sub_charenc CP932 を置きます。
ffmpeg -n -i sample.mp4 -sub_charenc CP932 -i sub_sjis.srt -map 0:v:0 -map "0:a:0?" -map 1:s:0 -c:v copy -c:a copy -c:s mov_text soft_sjis.mp42026年10月2日、練習用の日本語SRTで実行し、MP4に mov_text の字幕トラックが入ることを確認しました。
埋め込み字幕を除いて戻す
ffmpeg -n -i soft.mp4 -map 0:v -map 0:a? -c copy without_subtitles.mp4映像と、存在する音声だけを別ファイルにコピーし、字幕を除きます。
練習用動画では字幕トラックが消え、映像の全360コマが元動画と同じ内容で残りました。
焼き込んだ文字はこの方法では消せないので、保管しておいた元動画から作り直してください。
UTF-8のBOMあり・なしとCP932指定の焼き込みは、同じ字幕の描画になりました。
MP4とMKVへの埋め込みでは映像の360コマが元と一致し、MKVからの字幕取り出しは時刻・本文とも元と一致しました。
埋め込み字幕のオン・オフと表示スタイルは、配布先のプレーヤーでも確認してください。
過去の12秒素材のファイルサイズ
| 方法 | 映像 | 大きさ |
|---|---|---|
| 元の動画 | — | 4,809,665 バイト |
| 焼き込み | 作り直し(H.264) | 4,644,959 バイト |
| MP4 に埋め込み | そのまま | 4,810,393 バイト |
| MKV に埋め込み | そのまま | 4,803,164 バイト |
この入力では映像をコピーした埋め込みのサイズ差は小さい結果でした。字幕の量やコンテナが変われば、同じ差になるとは限りません。
焼き込みは映像を作り直すので、画質の設定(-crf など)によって大きさが変わります。
文字が出ない・文字化け・時刻ズレを切り分ける
| 症状 | 次の確認 |
|---|---|
| 字幕フィルターを初期化できない | subtitlesの有無、字幕ファイルの場所とパスの引用符を確認する |
| Invalid UTF-8と表示される | SRTの元の文字コードを確認。焼き込みはcharenc、別入力は-sub_charencを使う |
| 日本語が四角や空白になる | 日本語の字形を含むフォントを確認し、FontNameまたはfontsdirを指定する |
| 埋め込んだ字幕が見えない | ffprobeで字幕トラックを確認し、対応プレーヤーで字幕を選択する |
| 字幕の時刻がずれる | SRTと動画の時間の基準を確認する。先頭を切り出した場合にSRTの時刻が元動画基準のままかを調べる |
| 字幕を消したい | トラックなら映像・音声だけを別名へコピーする。焼き込みなら字幕のない元動画から作り直す |
Windowsのパス例で確認したのはコロンを含むASCIIのフルパスです。空白や引用符・カンマなども含む任意の名前に、同じ書き方で対応できることを保証するものではありません。字幕ファイルと作業フォルダーを揃えて単純な名前にする方法から試してください。フォントのFontSizeはASS形式のスタイル値で、書き出し画面で必ずその数値のピクセル高になる指定とは扱わず、実際の出力で決めます。
2026年10月3日の自作素材での検証結果
Windows 11 Pro(build 26200)、Ryzen 5 7530U・RAM約16GB、FFmpeg 9.0.2で、testsrc2の色模様と440Hzの合成音から640×360・30fps・12秒のH.264/AAC動画を生成し、SRT記事の3字幕を使用しました。処理速度や撮影素材の画質を比較する試験ではありません。
| 処理 | 確認した結果 |
|---|---|
| UTF-8・BOMありUTF-8・CP932指定で焼き込み | 各360コマのデコード後の映像SHA-256が一致。CP932未指定はエラー |
| コロンをエスケープしたWindowsフルパス | 相対パスと同じ360コマの映像に一致 |
| MP4へmov_text/MKVへSRTを追加 | 映像のデコードSHA-256が元と一致。音声も一致 |
| MP4から字幕を除く | 字幕トラックなし。元の映像・音声に一致 |
| MKVからSRTを取り出す | 3字幕の時刻と本文が一致。入力と出力を保持 |
今回の焼き込み出力も音声はコピーし、デコードしたPCMのSHA-256が元と一致しました。検査対象は生成した入力と出力で、Premiereへの読み込みや任意のプレーヤーでの字幕切り替えを実施した結果ではありません。

出力を配布する前の確認
- ffprobeで映像・音声・必要な字幕のトラックを確認する。字幕を含めたつもりでもマッピングから外れていないかを見る
- 焼き込みなら、日本語、複数行、画面端、必要な字幕の最初と最後を実際に再生する
- 埋め込みなら、配布先と同じプレーヤーで表示・非表示や言語の選択を確認する
- 字幕のない元動画とSRTを残す。再エンコードを繰り返す前に元入力へ戻る
SRTの時刻と文字コードはSRTの作り方、導入とコマンドの基本はFFmpegの基本操作、編集時の音ズレはPremiereの音ズレ対策、関連手順は動画編集の手順一覧へ進んでください。
公式資料確認:2026年10月3日。subtitlesのcharenc・force_style・fontsdir、字幕デコードのsub_charenc、ストリーム選択とコピー。
