Amazonで商品を見るセール会場へ

FFmpegで字幕を焼き込む・埋め込む方法|SRT・MP4・文字化け対策

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=subtitles

subtitlesには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 でそのまま写します。

ffmpegで字幕を焼き込んだ動画の1コマ。画面の下に白い文字に黒いふちの日本語の字幕が表示されている

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

2行の字幕を焼き込んだ動画の1コマ。1行目と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
force_styleでYu Gothic UI・大きさ28・ふち2を指定して焼き込んだ字幕の1コマ

このときのログでは、指定どおり 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.mp4
stream|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=jpn

MKVに入れる

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.mkv

MKV なら、字幕は 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.mp4

2026年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 バイト
2026年9月29日の1280×720・30fps・12秒の生成動画の既存結果。今回の640×360入力の値ではありません。

この入力では映像をコピーした埋め込みのサイズ差は小さい結果でした。字幕の量やコンテナが変われば、同じ差になるとは限りません。

焼き込みは映像を作り直すので、画質の設定(-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への読み込みや任意のプレーヤーでの字幕切り替えを実施した結果ではありません。

自作の色模様の動画の6秒時点に、2行目も・このように表示されます、の2行の日本語字幕を表示したフレーム
2026年10月3日の出力の6秒時点。Yu Gothic UI・FontSize 28・Outline 2。2行の日本語表示を実際のフレームで確認。アプリの操作画面ではありません。

出力を配布する前の確認

  1. ffprobeで映像・音声・必要な字幕のトラックを確認する。字幕を含めたつもりでもマッピングから外れていないかを見る
  2. 焼き込みなら、日本語、複数行、画面端、必要な字幕の最初と最後を実際に再生する
  3. 埋め込みなら、配布先と同じプレーヤーで表示・非表示や言語の選択を確認する
  4. 字幕のない元動画とSRTを残す。再エンコードを繰り返す前に元入力へ戻る

SRTの時刻と文字コードはSRTの作り方、導入とコマンドの基本はFFmpegの基本操作、編集時の音ズレはPremiereの音ズレ対策、関連手順は動画編集の手順一覧へ進んでください。

公式資料確認:2026年10月3日。subtitlesのcharenc・force_style・fontsdir、字幕デコードのsub_charenc、ストリーム選択とコピー。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

動画編集のおすすめ書籍

動画編集PCの選び方

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次