Askthewind’s diary

個人的なメモ

FFmpegのdrawtextでカウントダウンタイマーをつける

Show countdown with drawtext

 

Add countdown timer with drawtext

f:id:Askthewind:20181216214815g:plain

 FFmpegのdrawtextでカウントダウンタイマーをつける

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='%{eif\:11-t\:d}':fontcolor=white:fontsize=24:x=w-tw-20:y=th:box=1:boxcolor=black@0.4:boxborderw=10:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Show Countdown With Drawtext':fontcolor=white:fontsize=24:x=20:y=(h-th)-20,format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='%{eif\:11-t\:d}':fontcolor=white:fontsize=24:x=w-tw-20:y=th:box=1:boxcolor=black@0.4:boxborderw=10:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Show Countdown With Drawtext':fontcolor=white:fontsize=24:x=20:y=(h-th)-20,format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"
 

カウントダウンタイマーのコマンド 秒タイプ

:text='%{eif\:11-t\:d}'

format=yuv444p,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf'でフォーマット形式をyuv444pに変換してカウントダウンタイマーのフォントスタイルを指定しています。

:text='%{eif\:11-t\:d}'でカウントダウンタイマーをを設定しています。

:fontcolor=white:fontsize=24:x=w-tw-20:y=thでカウントダウンタイマーの、フォントカラーとフォントサイズを指定して表示位置を設定しています。

:boxcolor=black@0.4:boxborderw=10:enable='between(t,0,10)'でカウントダウンタイマーの背景となるboxを透過して幅を設定後、カウントダウンタイマーとboxの表示時間を設定しています。

drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Show Countdown With Drawtext'
:fontcolor=white:fontsize=24:x=20:y=(h-th)-20,format=yuv420pでテロップのフォントスタイルと文字、フォントカラーとフォントサイズを指定してテキストの位置を設定して他のデバイスでも見れるようにformat=yuv420pで出力を最適化しています。

 

Show text dynamic fontcolor automatically

f:id:Askthewind:20181216215657g:plain

テキストの色を時間指定で変える

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "scale=480:-1:flags=lanczos+accurate_rnd,format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr=%{eif\\: if(lt(t\,7)\, 0xffffff\, 0xff0000) \\: x}:fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Show Text Fontcolor Automatically':fontcolor_expr=%{eif\\: if(lt(t\,7)\, 0xffffff\, 0xff9999) \\: x}:fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "scale=480:-1:flags=lanczos+accurate_rnd,format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr=%{eif\\: if(lt(t\,7)\, 0xffffff\, 0xff0000) \\: x}:fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Show Text Fontcolor Automatically':fontcolor_expr=%{eif\\: if(lt(t\,7)\, 0xffffff\, 0xff9999) \\: x}:fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"
 

テキストの色を時間指定で変えるコマンド

:fontcolor_expr=%{eif\\:if(lt(t\,7)\,0xffffff\,0xff0000)\\:x}
 
Show text fading in of font color

f:id:Askthewind:20181216233832g:plain

テキストの色をフェードインする

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Show Text Fontcolor Automatically':fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Show Text Fontcolor Automatically':fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"
 
Show text fading in of font color with border

f:id:Askthewind:20181217073438g:plain

テキストの色をフェードインする(ボーダーを付けた場合)

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':bordercolor='black':borderw='1':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':bordercolor='black':borderw='1':text='Show Text Fontcolor Automatically':fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':bordercolor='black':borderw='1':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':bordercolor='black':borderw='1':text='Show Text Fontcolor Automatically':fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}':fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

テキストの色をフェードインするコマンド

:fontcolor_expr='ffffff%{eif\:clip(1+(255*t/4)\,0\,255)\:x\:2}'

ボーダー(枠線)の色は変化せず、フォントカラーの初期値はボーダーカラーに設定した色がが透過された状態でフェードインする

 
Randomly change the font color

f:id:Askthewind:20181217004934g:plain

フォントカラーをランダムに変える

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr=random:fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Randomly Change The Fontcolor':fontcolor_expr=random:fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "format=yuv444p,drawbox=x=(iw-w)-8:y=10:w=36:h=38:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text=%{eif\\:mod(11-t\,60)\\:d}:fontcolor_expr=random:fontsize=30:x='(w-tw)-20':y='16':enable='between(t,0,10)',drawbox=y=ih*0.7:w=iw:h=56:t=fill:color=black@0.4:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Randomly Change The Fontcolor':fontcolor_expr=random:fontsize=30:x='(w-tw)-(w-tw)/2':y='(h-th)/1.17':enable='between(t,0,10)',format=pix_fmts=yuv420p" -movflags +faststart -c:v libx264 -crf 20 "output.mp4"

 

フォントカラーをランダムに変えるコマンド

:fontcolor_expr=random
 
Add Countdown Timer With Testsrc

f:id:Askthewind:20181218004401g:plain

動画をリサイズしてカウントダウンタイマーとテキストを表示する

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "testsrc[t];[0]scale=480:-1:flags=lanczos+accurate_rnd[a];[t]trim=01:10,reverse,setpts=PTS-STARTPTS,crop=61:52:224:94,lutrgb=r=256:g=256,colorkey=yellow[b];[a][b]overlay=(W-w)-30:20:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Add Countdown Timer With Testsrc':fontcolor=white:fontsize=24:x=20:y=(h-th)-20:enable='between(t,0,10)'" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "testsrc[t];[0]scale=480:-1:flags=lanczos+accurate_rnd[a];[t]trim=01:10,reverse,setpts=PTS-STARTPTS,crop=61:52:224:94,lutrgb=r=256:g=256,colorkey=yellow[b];[a][b]overlay=(W-w)-30:20:enable='between(t,0,10)',drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Add Countdown Timer With Testsrc':fontcolor=white:fontsize=24:x=20:y=(h-th)-20:enable='between(t,0,10)'" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 

testsrc[t]でタイマー付きのtestsrcフィルターを生成して[t]という任意の名前つけています。

[0]scale=480:-1:flags=lanczos+accurate_rnd[a]で入力した動画を拡大縮小のアルゴリズムオプションにlanczos+accurate_rndを指定してアスペクト比を保ったままリサイズして[a]という任意の名前つけています。[0]は[0:v]の略(1番目に入力した動画の映像部分)。

[t]trim=00:66,reverse,setpts=PTS-STARTPTS,
crop=61:52:224:94,lutrgb=r=256:g=256,colorkey=yellow[b]でtestsrcの再生時間==スタート秒とエンド秒、逆再生フィルターreverseを設定後、再生時刻の情報(PTS, presentation timestamp)を設定してtestsrcがカウンタータイマー部分だけになるようにクロップして背景部分を黄色にした後、透過して[b]という任意の名前つけています。

[a][b]overlay=(W-w)-20:(H-h)-20:enable='between(t,5,66)'でクロップしてカウンタータイマー部分のみになったtestsrcを入力動画への貼り付け位置と合成時間の指定をして入力動画と合成しています。

drawtext=fontfile='C\:/WINDOWS/Fonts/impact.ttf':text='Add Countdown Timer With Testsrc'
:fontcolor=white:fontsize=24:x=20:y=(h-th)-20:enable='between(t,0,10)'
でテロップのフォントスタイルと文字、フォントカラーとフォントサイズ、表示位置と表示時間を指定しています。

 

タイマーを10秒から99秒の間で設定する場合はcrop=61:52:224:94になります。
min:10sec max:99sec
crop=61:52:224:94

タイマーを100秒から999秒の間で設定する場合はcrop=93:52:192:94になります。
min:100sec max:999sec
crop=93:52:192:94

タイマーを1000秒から9999秒の間で設定する場合はcrop=125:52:160:94になります。
min:1000sec max:9999sec
crop=125:52:160:94

 

タイマーを0秒から9秒の間で設定する場合は[t]trim=01:10,reverse,setpts=PTS-STARTPTS,
crop=61:52:224:94,lutrgb=r=256:g=256,colorkey=yellow[b];が[t]trim=01:09,reverse,
setpts=PTS-STARTPTS,crop=29:52:256:94,colorkey=black[b];になります。trim=01:09の部分はセットする秒数によって任意で変えてください。タイマー部分の背景色(黒)を残したい場合は[t]trim=01:09,reverse,setpts=PTS-STARTPTS,crop=29:52:256:94[b];になります。
min:0sec max:9sec
crop=29:52:256:94

 

Add Countdown Timer With ver.Testsrc2

f:id:Askthewind:20181218191252g:plain

 動画をリサイズしてカウントダウンタイマーとテキストを表示する ver.testsrc2

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "testsrc2[t];[t]trim=00:10,reverse,setpts=PTS-STARTPTS,crop=101:37:2:2[a];[0]split[b][c];[b]scale=480:-1:flags=lanczos+accurate_rnd[d];[c]scale=480:-1:flags=lanczos+accurate_rnd[e];[d][a]overlay=10:10:enable='between(t,0,10)'[f];[e][f]blend=c0_opacity=0.5,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Add Countdown Timer With Testsrc2':fontcolor=white:fontsize=24:x=20:y=(h-th)-20:enable='between(t,0,10)'" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "testsrc2[t];[t]trim=00:10,reverse,setpts=PTS-STARTPTS,crop=101:37:2:2[a];[0]split[b][c];[b]scale=480:-1:flags=lanczos+accurate_rnd[d];[c]scale=480:-1:flags=lanczos+accurate_rnd[e];[d][a]overlay=10:10:enable='between(t,0,10)'[f];[e][f]blend=c0_opacity=0.5,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Add Countdown Timer With Testsrc2':fontcolor=white:fontsize=24:x=20:y=(h-th)-20:enable='between(t,0,10)'" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"

 

testsrc2のタイマー部分をクロップするコマンド

crop=101:37:2:2
 
Add Countdown Timer With ver.Testsrc2 other

f:id:Askthewind:20181218192709g:plain

動画をリサイズしてカウントダウンタイマーとテキストを表示する ver.testsrc2.other

FFmpegでプレビュー

ffmpeg -i "input.mp4" -filter_complex "testsrc2[t];[t]trim=00:10,reverse,setpts=PTS-STARTPTS,crop=101:19:2:2[a];[0]split[b][c];[b]scale=480:-1:flags=lanczos+accurate_rnd[d];[c]scale=480:-1:flags=lanczos+accurate_rnd[e];[d][a]overlay=10:10:enable='between(t,0,10)'[f];[e][f]blend=c0_opacity=0.5,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Add Countdown Timer With Testsrc2':fontcolor=white:fontsize=24:x=20:y=(h-th)-20:enable='between(t,0,10)'" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i "input.mp4" -filter_complex "testsrc2[t];[t]trim=00:10,reverse,setpts=PTS-STARTPTS,crop=101:19:2:2[a];[0]split[b][c];[b]scale=480:-1:flags=lanczos+accurate_rnd[d];[c]scale=480:-1:flags=lanczos+accurate_rnd[e];[d][a]overlay=10:10:enable='between(t,0,10)'[f];[e][f]blend=c0_opacity=0.5,drawtext=fontfile='C\:/WINDOWS/Fonts/Alial.ttf':text='Add Countdown Timer With Testsrc2':fontcolor=white:fontsize=24:x=20:y=(h-th)-20:enable='between(t,0,10)'" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"

 

testsrc2のタイマー部分をクロップするコマンド other ver.

crop=101:19:2:2
 
 
参考にさせていただきました。Special Thanks