字幕ファイルを動画に焼き付ける(ハードサブ)subtitlesフィルタの使い方。字幕ファイルのスタイルを書き換えて字幕ファイルを出力するフィルタではない。似たフィルタにassフィルタがあるが、subtitlesフィルタはassフィルタよりも複雑な設定ができる。このフィルタを使うには–enable-libasslibavcodec、libavformatが必要。

ass の字幕ファイルを動画に焼き付ける ass

基本コマンド

input.ass ファイルを表示する。
ffmpeg -i input -vf subtitles=sub.ass output
ffplay -i input -vf subtitles=sub.ass

映像の最初をカット(開始25分から26分時点まで)して同時に字幕時間の最初もカットする。参照元
ffmpeg -ss 25:00 -to 26:00 -copyts -i video -ss 25:00 -vf subtitles=sub.srt -c:a copy output.mp4

webm 形式にエンコードするときは-output_ts_offsetをつける。参照元
ffmpeg -ss 25:00 -to 26:00 -copyts -i video -vf subtitles=sub.srt -c:v libvpx-vp9 -crf 30 -b:v 0 -qmin 3 -qmax 40 -c:a copy -output_ts_offset 25:00 output.webm

ffmpeg で指定時間でカットするまとめ

シークバーが意図したものより長くなっているときは-avoid_negative_ts make_zeroを出力オプションにつける
ffmpeg -ss 23:10 -copyts -i input.mp4 -vf subtitles=input.mp4 -avoid_negative_ts make_zero output.mp4

FFmpeg: How can I burn subs and clip a video with only one line? – Super User

subtitlesフィルタで動画ファイルから字幕を選んだときはBT.601のカラースペースらしいので、BT.709素材の時はBT.601に変換しsubtitlesフィルタを当てて、BT.709に戻す。おそらく字幕ファイル単体で読み込んだときはカラースペースの変換は不要。
ffmpeg -y -i input.mkv -filter_complex scale=in_color_matrix=bt709:out_color_matrix=bt601,subtitles=input.mkv:si=0,scale=in_color_matrix=bt601:out_color_matrix=bt709 -pix_fmt yuv420p output.mp4

video – FFmpeg incorrect colourspace with hardcoded subtitles – Super User

テキスト字幕のストリームをコピーしてフォントサイズが変わるときは-map 0:t?も追加する。
Copied .ass Subtitle Changes Font Size : ffmpeg

公式ドキュメント: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の内容を強制する
  • wrap_unicode[boolean]
    Unicode 改行アルゴリズムに則って改行する。libass release 0.17.0以降がリンクされているときはオプションが最初から有効になる。されてないときは無効になる。

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フィルタで小さくするほど背景が透過する。-ss 6sp=6を併用して6秒読み込み時間をずらしている。
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/bancodesrtASS Tags – Aegisub Manual- archive.orgを参照。

node.js – How to create watermark underlined text using ffmpeg – Stack Overflow
ffmpeg subtitles alignment and position – Stack Overflow

ASS字幕はスタイルがあらかじめ指定してあることが多いのでSRT字幕を使う。KEY=VALUEで指定し、カンマ,でつなげる。Name指定が出来ないので一括書き換えができない。字幕ファイルに書いてある設定を優先する。

スタイルを適用していないSRT字幕で出力するには-c:s textを指定する。
ffmpeg -i input -vn -an -c:s text sub.srt

,\でエスケープするかではさむ。
ffplay -i input -vf subtitles=sub.srt:'force_style=FontName=Arial\,Fontsize=64\,OutlineColour=&H8000ff00\,Outline=3\,Shadow=3'

Windowsのfontsdirの指定。日本語のFontName指定がうまくいかない。
ffmpeg -i input -vf subtitles=sub.ass:fontsdir="C\\:Windows/Fonts" output

ttfフォントは使えないが、otfフォントは使える。しかしotfフォントはWindowsのデフォルトに入ってない。
python – ffmpeg burned-in subtitles render in the wrong font – Stack Overflow
Releases · fontforge/fontforge · GitHub

  • FontName
    拡張子を含めて指定しない
  • Fontsize
  • PrimaryColour
    文字の色指定。ABGRの順番、H以降の8文字が該当する。0xAABBGGRRの00からffまでが指定できる。AAは00が不透明で、ffが完全に透明になる。半透明は80。色名での指定はできない
  • SecondaryColour
  • OutlineColour
    縁取りの色指定
  • BackColour
  • Bold
  • Italic
  • Underline
    下線
  • StrikeOut
    打ち消し線
  • ScaleX
  • ScaleY
  • Spacing
  • Angle
    文字の角度指定。90で縦書きになるが文字も回転する
  • BorderStyle
    1:文字に沿って縁取る
    3:文字の周りを四角く縁取る
  • Outline
    BorderStyleの縁取りの太さの指定
  • Shadow
    文字の右下に表示する影の太さの指定
  • Alignment
    1: 左下, 2: 下中央, 3: 右下, 5: 左上, 6: 上中央, 7: 右上, 9: 中央左, 10: 中央, 11: 中央右
  • MarginL
  • MarginR
  • MarginV
  • Encoding

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)