字幕ファイルを動画に焼き付ける(ハードサブ) subtitles
フィルタの使い方。似たフィルタに ass
フィルタがあるが、subtitles
フィルタはass
フィルタよりも複雑な設定ができる。このフィルタを使うには –enable-libass と libavcodec, libavformat が必要である。
基本コマンド
input.ass ファイルを表示する
ffmpeg -i input -vf subtitles=input.ass output
ffplay -i input -vf subtitles=input.ass
公式ドキュメント:FFmpeg Filters Documentation : subtitles
オプション
- filename, f[string]
字幕ファイルの指定。必須項目 - original_size[image_size]
ASS 字幕が作成された動画の解像度を指定する。基本は無指定でよいが、アスペクト比が間違えて字幕ファイルに解像度が書き込まれたときに設定を書き換える - fontsdir[string]
フォントディレクトリの指定 - alpha[boolean]
背景を透過して文字だけ表示させる
既定値:0 - charenc[string]
文字コードをエンコードする。UTF-8 以外のときに有用 - stream_index, si[int]
複数の字幕ファイルが含まれる場合に何番目を読み込むかを指定
既定値:-1(0 が1入力)
範囲:-1 から INT_MAX まで - force_style[string]
Styles の内容を強制する
alpha の使い方
alpha を使えば字幕以外がすべて透過するのでは無くて、予め映像自体を透過させておかないと字幕以外が透過しない。color ソースでのサンプル。開始6秒の時点で字幕が表示されていれば背景が透過して字幕が普通に表示される。
ffmpeg -ss 6 -f lavfi -i "color=color=white@0.0:size=800x600,format=rgba,subtitles=input.ass:alpha=1" -frames:v 1 output.png
普通の動画で映像を透過させるには映像をアルファチャンネル付きで読み込む必要があり、さらにアルファチャンネルの値を lutrgb
フィルタで小さくするほど透過する。
ffmpeg -ss 6 -f lavfi -i "movie=input.mp4:sp=6,format=rgba,lutrgb=val:val:val:0,subtitles=input.ass:alpha=1" -frames:v 1 output.png
stream_index の使い方
複数の字幕が含まれるファイルを subtitles
フィルタで読み込んだときにどれを表示するかを指定する。sub.mkv に含まれる1番目の字幕を表示する。2番目の字幕なら 1 を指定する。
ffmpeg -i input -vf "subtitles=sub.mkv:stream_index=0" output
force_style の使い方
具体的な指定の意味は ASS 仕組みと書き方 : geocities.co.jp/bancodesrt を参照。
指定例。KEY=VALUE で指定し、,(カンマ) でつなげる。Name 指定が出来ないので一括書き換えができない。
ffplay -i input -vf "subtitles=input.ass:'force_style=FontName=しねきゃぷしょん,Fontsize=64,OutlineColour=&H8000ff00,Outline=3,Shadow=3'"
- FontName
- Fontsize
- PrimaryColour
文字の色指定、ABGR の順番、H以降の8文字が該当する
&HAABBGGRR の 00 から ff までが指定できる
AA は 00 が不透明で、ff が完全に透明になる。半透明は 80 - SecondaryColour
- OutlineColour
- BackColour
- Bold
- Italic
- Underline
下線 - StrikeOut
打ち消し線 - ScaleX
- ScaleY
- Spacing
- Angle
文字の角度指定。90で縦書きになるが、縦書きフォントを使わないと単に縦表示になる - BorderStyle
1:文字に沿って縁取る
3:文字の周りを四角く縁取る - Outline
縁取りの太さの指定 - Shadow
文字の右下に表示する影の太さの指定 - Alignment
- MarginL
- MarginR
- MarginV
- Encoding