字幕の焼き込みと埋め込み — SRT・ASS・ハードサブとソフトサブ

動画に字幕を付ける方法は大きく ハードサブ(焼き込み)ソフトサブ(埋め込み) の2種類に分かれます。それぞれの仕組みと FFmpeg での操作方法を解説します。


ハードサブとソフトサブの違い

方式概要主な用途
ハードサブ(焼き込み)字幕テキストを映像ピクセルに直接描画する。映像の一部になるため後から消せない字幕が外れないよう固定したい場合、再生環境を問わず表示させたい場合
ソフトサブ(埋め込み)字幕を独立したトラックとしてコンテナ(MKVなど)に格納する。後からON/OFFや言語切替が可能複数言語対応、編集の自由度を保ちたい場合

ハードサブは再エンコードが必要で処理時間がかかりますが、どのプレイヤーでも確実に表示されます。ソフトサブはコピー処理だけで済むことが多く高速ですが、対応プレイヤーが限られます。


ハードサブ(焼き込み)

SRT字幕の焼き込み — subtitles フィルタ

subtitles フィルタは libass を内部で使用して字幕ファイルを映像に描画します。FFmpeg 6.1で確認済み。

ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output.mp4

.srt ファイルは KNOWN_EXTS に含まれないためテキストブロック表示です。実行時は subtitle.srt を実際のファイルパスに置き換えてください。

フォントサイズや位置を調整する場合:

ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt:force_style='FontSize=24,Alignment=2'" output.mp4

force_style に ASS スタイル書式で上書きできます(FontSizePrimaryColourAlignment など)。

ASS字幕の焼き込み — ass フィルタ

ASS(Advanced SubStation Alpha)はフォント・色・アニメーションなど高度な書式指定が可能な字幕フォーマットです。subtitles フィルタでも読めますが、ass フィルタはスタイルをより忠実に再現します。

ffmpeg -i input.mp4 -vf ass=subtitle.ass output.mp4

subtitles=subtitle.assass=subtitle.ass はほぼ同等の出力になりますが、ass フィルタは ASS 専用の初期化パスを使うため、複雑なスタイルを持つファイルでは ass フィルタを推奨します。

フォント指定(ASS)

ASS ファイル内の [V4+ Styles] セクションで Fontname を指定します。システムにインストールされていないフォントを使う場合は fontsdir オプションでフォントディレクトリを指定できます。

ffmpeg -i input.mp4 -vf "ass=subtitle.ass:fontsdir=/path/to/fonts" output.mp4

ソフトサブ(埋め込み)

MKVに字幕トラックを埋め込む

MKV コンテナは複数の字幕トラックをサポートします。映像・音声をコピーしながら SRT 字幕を追加する基本コマンドです。

ffmpeg -i input.mp4 -i subtitle.srt -c copy -c:s srt output.mkv

複数言語の字幕を埋め込む場合:

ffmpeg -i input.mp4 -i sub_ja.srt -i sub_en.srt \
  -c copy -c:s srt \
  -metadata:s:s:0 language=jpn \
  -metadata:s:s:1 language=eng \
  output.mkv

字幕ストリームのコピー(既存トラック)

すでに字幕トラックを持つ MKV ファイルから字幕を維持したまま変換する場合は -c:s copy を使います。

ffmpeg -i input.mkv -c:v libx264 -c:a aac -c:s copy output.mkv

CI テスト用の入力ファイルには字幕トラックがないため、このコマンドはテキストブロックで示します。


MKV → MP4 への字幕変換

MP4 は字幕フォーマットとして mov_text(SRT ベース)を使います。MKV の字幕トラックを MP4 に変換する場合:

ffmpeg -i input.mkv -c:v copy -c:a copy -c:s mov_text output.mp4

注意点:


字幕トラックの確認・抽出

埋め込まれている字幕トラックを確認するには ffprobe を使います(出力ファイルなし):

ffprobe -v error -show_streams -select_streams s input.mkv

字幕を外部ファイルとして抽出するには:

ffmpeg -i input.mkv -c:s srt extracted_subtitle.srt

まとめ

ユースケース推奨方式コマンドのポイント
字幕固定・あらゆる環境で表示ハードサブ-vf subtitles= または -vf ass=
後から切替可能にしたいソフトサブ(MKV)-c:s srt で埋め込み
既存トラックをそのまま保持コピー-c:s copy
MKV → MP4 変換mov_text-c:s mov_text

関連記事:


動作確認: ffmpeg 6.1.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg-filters.html / ffmpeg.org/ffmpeg.html / trac.ffmpeg.org/wiki/HowToBurnSubtitlesIntoVideo