字幕の焼き込みと埋め込み — 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 スタイル書式で上書きできます(FontSize・PrimaryColour・Alignment など)。
ASS字幕の焼き込み — ass フィルタ
ASS(Advanced SubStation Alpha)はフォント・色・アニメーションなど高度な書式指定が可能な字幕フォーマットです。subtitles フィルタでも読めますが、ass フィルタはスタイルをより忠実に再現します。
ffmpeg -i input.mp4 -vf ass=subtitle.ass output.mp4
subtitles=subtitle.ass と ass=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
-c copyは映像・音声を再エンコードせずコピー-c:s srtは字幕ストリームを SRT フォーマットで埋め込む.srt入力ファイルが必要なためテキストブロック表示
複数言語の字幕を埋め込む場合:
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
注意点:
- ASS/SSA 字幕は
mov_textに変換するとスタイル情報が失われます - MP4 は一般に字幕対応プレイヤーが少なく、互換性が高いのは MKV です
- 再生環境が限定されるなら、ハードサブへの切り替えも検討してください
字幕トラックの確認・抽出
埋め込まれている字幕トラックを確認するには 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