Quantcast
Channel: FFmpeg | ニコラボ
Viewing all articles
Browse latest Browse all 310

文字を描写する drawtext

$
0
0

文字を直接コマンドに記述したり、ファイルを読み込んで描写する drawtext フィルタの使い方。現在のところ絵文字には対応していない。文字を動かしたり、表示非表示の切り替えや、内容を変更したり、色を変えたり出来る。ただし映像の途中に拡大縮小は出来ないので ass, subtitles フィルタを使って字幕を動かす方法をとる。

外部ライブラリフィルタなので別途インストールが必要である。基本となる –enable-libfreetype、font 設定に必要な –enable-libfontconfig。アラビア文字で右から左描写には –enable-libfribidi が必要。

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

テキスト描写にはフォント描写の知識がないとオプションの意味が分かりにくい。

基本コマンド

color ソースに aiueo を左上に描写
ffplay -f lavfi -i color=white -vf "drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':text='aiueo'"

msgothic フォントを指定し、あいうえお を左から右へ1フレーム毎に1ピクセル移動させる
"drawtext=fontsize=30:box=1:boxcolor=white@0.5:fontcolor=black:fontfile='C\://WINDOWS/Fonts/msgothic.ttc':text='あいうえお':x=n"

hello world を映像の中心に描写
"drawtext=fontsize=30:box=1:boxcolor=white@0.5:fontcolor=black:fontfile='C\://WINDOWS/Fonts/msgothic.ttc':text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"

5秒毎にランダムな場所に描写
"drawtext=fontsize=30:fontfile='C\://WINDOWS/Fonts/msgothic.ttc':text='hello world':x=if(eq(mod(t\,5)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,5)\,0)\,rand(0\,(h-text_h))\,y)"

横に中央からフォント半分ほど左に、縦に半分からベースラインから上の部分だけ上げたところに描写
"drawtext="fontsize=60:fontfile='C\://WINDOWS/Fonts/msgothic.ttc':fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent"

タイムライン編集を使って3秒毎に1秒描写
"drawtext="fontfile='C\://WINDOWS/Fonts/msgothic.ttc'.ttf:fontcolor=white:x=100:y=x/dar:text='blink':enable=lt(mod(t\,3)\,1)"

スタイルにセミボールドを指定する
"drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg'"

strftime() 書式を使って、英語での曜日、英語での月、日付、年を描写
"drawtext=fontfile='C\://WINDOWS/Fonts/msgothic.ttc':text='%{localtime\:%a %b %d %Y}'"

公式ドキュメント:FFmpeg Filters Documentation : drawtext

描写を読みやすくする

フォントカラーを変える
"drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':text='aiueo':fontcolor=yellow:x=40:y=40"

フォントサイズを変える
"drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':text='aiueo':fontsize=64:x=40:y=40"

四角いボックスをフォントの背景に配置
"drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':text='aiueo':box=1:boxcolor=yellow:boxborderw=10:x=40:y=40"

フォント周りを縁取る
"drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':text='aiueo':bordercolor=yellow:borderw=3:x=40:y=40"

フォントからの位置にオフセット指定した影を配置
"drawtext=fontfile='C\://WINDOWS/Fonts/arial.ttf':text='aiueo':shadowcolor=yellow:shadowx=3:shadowy=3:x=40:y=40"

オプション

オプション数が膨大なのでオプション名は省略しないほうがわかりやすい。

  • fontfile[string]
    フォントファイルのパスを指定。日本語の場合は日本語フォントを指定しないと正しく描写されない。Windows だと、C:\Windows\Fonts を開いて、プロパティからファイル名を取得する
  • text[string]
    描写するテキストの指定。文字コードは UTF-8 でなければならない。また以下の書式も使える。スペースで間を開ける場合は “‘ ‘” で挟むかエスケープする。Text expansion の項を参照
  • textfile[string]
    描写するテキストファイルのパスを指定。text と併用できない。文字コードは UTF-8 でなければならない。改行する場合はこちらの方が手軽
  • fontcolor[color]
    描写内容の色指定。詳しくは FFmpeg Utilities Documentation : Color を参照。指定した色の後ろに @0.5 とすることで透過指定も可能
    既定値:black
  • fontcolor_expr[string]
    描写内容の色指定の拡張版。フレーム数や時間で色を変えられる。0xRRGGBB[AA] の順番で指定する。後ろに @0.5 とすることで透過指定も可能
    例:fontcolor_expr=’0x%{eif\:print(mod(n\,256))\:x\:2}%{eif\:print(mod(n\,256))\:x\:2}%{eif\:print(mod(n\,256))\:x\:2}’@0.5
  • boxcolor[color]
    box の背景色を指定。random でランダムになる。詳しくは FFmpeg Utilities Documentation : Color を参照。指定した色の後ろに @0.5 とすることで透過指定も可能
    既定値:white
  • bordercolor[color]
    borderw の色を指定
    既定値:black
  • shadowcolor[color]
    text の影の色指定。詳しくは FFmpeg Utilities Documentation : Color を参照。指定した色の後ろに @0.5 とすることで透過指定も可能
  • box[boolean]
    描写内容の背景をテキスト幅で囲む
    既定値:0
  • boxborderw[int]
    box のサイズ指定。上下左右同じように広がる
    範囲:INT_MIN から INT_MAX まで
    既定値:0
  • line_spacing[int]
    set line spacing in pixels
    範囲:INT_MIN から INT_MAX まで
    既定値:0
  • fontsize[string]
    フォントサイズの指定
  • x[string]
    描写内容の横座標の指定。以下の書式が使える
  • y[string]
    描写内容の縦座標の指定。以下の書式が使える
  • shadowx[int]
    描写内容に影を横軸の方向に表示
  • shadowy[int]
    描写内容に影を縦軸の方向に表示
  • borderw[int]
    描写内容の縁取りのサイズの指定
  • tabsize[int]
    タブ1つがスペースいくつかの指定
    範囲:0 から INT_MAX まで
    既定値:4
  • basetime[int64]
    廃止予定。Set a start time for the count. Value is in microseconds. Only applied in the deprecated strftime expansion mode.
  • font[string]
    描写に使うフォントファミリーの名前
    既定値:Sans
  • timecode[string]
    text, textfile を使わずにタイムコードを描写する。書式は “hh:mm:ss[:;.]ff” 形式。時間指定でオフセットの指定になる
    例:timecode=’00\:00\:00\:00′
  • tc24hmax[boolean]
    24時間経過したら0時に戻る
    既定値:0
  • timecode_rate, r, rate[rational]
    timecode を使うときのフレームレートの指定で必須項目。分数や少数は一番近い整数になる
    既定値:0/1
    範囲:1 から INT_MAX まで
  • reload[boolean]
    textfile をリロードして内容が書き換わったらフレーム毎に書き換える
    既定値:0
  • alpha[string]
    描写内容を透過させる
    既定値:1(透過しない)
    範囲:0.1 から 1 まで
  • fix_bounds[boolean]
    check and fix text coords to avoid clipping
    既定値:0
  • start_number[int]
    The starting frame number for the n/frame_num variable.
    既定値:0
  • expansion[int]
    text拡張指定
    • none:無効
    • normal:有効。既定値
    • strftime:廃止予定
  • ft_load_flags[flags]
    フラグの指定。+ で複数指定できる。詳しくは公式サイトを参照
    • default
    • no_scale
    • no_hinting
    • render
    • no_bitmap
    • vertical_layout
      縦書きだが、文字が重なりうまく描写できない
    • force_autohint
    • crop_bitmap
    • pedantic
    • ignore_global_advance_width
    • no_recurse
    • ignore_transform
    • monochrome
    • linear_design
    • no_autohint

Text expansion

  • expr, e
    x, y で使った書式が使える
  • expr_int_format, eif
    x, y で使った書式が使え、第2引数で表示形式が指定できる
    • x:符号なし整数を16進数表示、アルファベットは小文字
    • X:符号なし整数を16進数表示、アルファベットは大文字
    • d:符号あり整数を10進数表示
    • u:符号なし整数を10進数表示
  • gmtime
    UTC を使って時間を表示する。strftime() 書式が使えるが一部使えない
  • localtime
    ローカルタイムゾーンを使って時間を表示する。strftime() 書式が使えるが一部使えない
  • metadata
    metadata を呼び出して描写する
  • n, frame_num
    0開始のフレーム番号
    例:text=’%{n}’
  • pict_type
    IPBフレームの表示
    例:text=’%{pict_type}’
  • pts
    • flt:マイクロ秒表示。第2引数でオフセットが使える
      例:text=’%{pts\:flt\:100}’
    • hms:時間分秒表示。hh:mm:ss 形式。第2引数でオフセットが使え、第3引数で 24HH を使うと 00-23 の範囲になり日が更新される
      例:text=’%{pts\:hms\:400000\:24HH}’
    • gmtime:UTC 時間で1970-01-01 00:00:00 から始まる。第2引数でオフセットが使える
    • localtime:ローカルタイムゾーンで日本なら 1970-01-01 09:00:00 から始まる。第2引数でオフセットが使える
      例:text=’%{pts\:localtime\:400000\:%Y}’

x, y の評価式

ffmpeg で使える計算書式 を併用することもできる。

  • sar
    サンプルアスペクト比
  • dar
    (w/h)*sar
  • hsub
    横のクロマサブサンプリング数。yuv420p ならば 2、yuv422p ならば 2
  • vsub
    縦のクロマサブサンプリング数。yuv420p ならば 2、yuv422p ならば 1
  • line_h, lh
    描写内容の高さ。fontsize で変化するが同じになるとは限らない
  • main_h, h, H
    入力した映像の縦解像度
  • main_w, w, W
    入力した映像の横解像度
  • max_glyph_a, ascent
    ベースラインからすべての描写内容の上の高さ
  • max_glyph_d, descent
    ベースラインからすべての描写内容の下の高さ。ベースラインから下に描写されなければ 0 になるが、”g” のような文字だとマイナスになる
  • max_glyph_h
    ascent – descent で、lh と同じようになる
  • max_glyph_w
    すべての描写内容からフォント1文字分の最大幅
  • n
    表示している映像のフレーム番号。0 から始まる
  • rand(min, max)
    最小値と最大値の値をランダムで返す
  • t
    表示している映像のタイムスタンプ
  • text_h, th
    描写内容の高さ。fontsize, text, textfile などで動的に変わる
  • text_w, tw
    描写内容の横幅。fontsize, text, textfile などで動的に変わる
  • x
    テキストが描画されるx座標のオフセット。x には自己参照になるので指定できない
  • y
    テキストが描画されるy座標のオフセット。y には自己参照になるので指定できない
  • pict_type
    1:I フレーム
    2:B フレーム
    3:P フレーム

応用例

test.txt を書き換えて描写内容を変更する
"drawtext=fontsize=32:box=1:boxcolor=white@0.5:fontcolor=black:fontfile='C\://WINDOWS/Fonts/msgothic.ttc':textfile='test.txt':reload=1"

映画などの編集作業でよくみる時間経過を表示するタイムコードを描写
"drawtext=fontsize=32:box=1:boxcolor=white@0.5:fontcolor=black:fontfile='C\://WINDOWS/Fonts/arial.ttf':timecode='00\:00\:00\:00':r=24:fontcolor=0xccFFFF"

ffmpegならこちらへ 3 [無断転載禁止]©2ch.net より

639名無しさん@お腹いっぱい。2018/05/27(日) 19:51:33.96ID:zoTvVaWy0
>フレームレートを大きくする前の動画の時間に対してタイムコードが付く
つまり倍速再生にして、時間経過も倍速表示にしたいと

25fps の動画の場合、倍速分の入力フレームレートを指定し、最初に倍速分の pts を掛けて、元に戻す
ffmpeg -r 50 -i input -vf setpts=PTS*2,”drawtext=fontsize=30:box=1:boxcolor=white@0.5:fontcolor=black:fontfile=’C\://WINDOWS/Fonts/arial.ttf’:text=’%{eif\:t\:d}'”,setpts=PTS/2 output.mp4

ffplay -f lavfi -i color=white -vf setpts=PTS*2,"drawtext=fontsize=30:box=1:boxcolor=white@0.5:fontcolor=black:fontfile='C\://WINDOWS/Fonts/arial.ttf':text='%{eif\:t\:d}'",setpts=PTS/2

映像フィルタを当てる前後のデータを見える化する
ffmpeg でテキストを動的に表示する
ニコ生のTSから一定時間毎に画像を出力する


Viewing all articles
Browse latest Browse all 310

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>