色々と苦労したので,メモ代わりに.動画の上にタイトルの文字を入れるのではなく,動画の開始前にタイトルを数秒間表示させる方法です.
#1. タイトル作成
ffmpeg -y ^
-f lavfi -i "color=c=black:s=1280x720:r=30000/1001:d=5.0" ^
-f lavfi -i "aevalsrc=0|0:c=stereo:s=44100:d=5.0" ^
-vf "drawtext=fontsize=60:fontfile=C\\://Windows/Fonts/arial.ttf:fontcolor=black:fontcolor=white:textfile='title.txt':x=(w-text_w)/2:y=(h-text_h)/2" ^
word.mp4
ffmpeg -y ^
-i word.mp4 ^
-vf "fade=t=in:st=0:d=2,fade=t=out:st=4:d=1" ^
word_f.mp4
5秒間の黒い動画を作成し,その上にテキストを表示させます.表示させる文字は別途テキストファイルを用意し,textfile='title.txt'にて指定.
2番目の処理では,文字をフェードイン,フェードアウトさせています.これで0~2秒でタイトルがフェードイン→2~4秒までタイトル表示→4~5秒でタイトルが消える動画が出来ました.
#2. 元の動画の前に空白を入れる
始めは上記の動画と元の動画をconcatで結合・・・としたが,エラーは出ないものの上手く結合されず.ffmpegのマニュアル等を調べていたらitsoffsetで動画に空白部分を追加出来るとの事で,これとoverlayを組み合わせる事にしました.
ffmpeg -y ^
-itsoffset 5 -i "input.mp4" ^
-af "adelay=5s|5s" ^
"input_of5.mp4"
adelayについて,PC上ではitsoffsetのみで5秒間の空白/無音が追加されたのですが,別端末(Androidタブレット)では動画と音が5秒間ずれると言う,環境によって再生のされ方が違う動画が出来てしまいました.
ここで,adelayにより,明示的に5秒間の無音を入れ,この問題は解決.
#3. 動画の結合
ffmpeg -y ^
-i "input_of5.mp4" ^
-i "word_f.mp4" ^
-filter_complex "overlay=x=0:y=0:enable='between(t,0,5)'" ^
-filter_complex "amix=inputs=2:duration=longest:dropout_transition=2" ^
"out.mp4"
overlayにて2つの動画を重ね,意図した音が消えないようにamixにて2つの音も重ねます.ポイントはoverlayでの時間指定で,enable='between(t,0,5)'により,t(時間[s])が0~5秒の間だけoverlayをenable状態にする事が出来ます.
#4. 終わりに
この手法,需要があまり無いのか,調べてみても,そのものの方法が出て来ませんでした.高価なツールを使えばきっと簡単に出来るし,ffmpegでやろうとする人は少ないのかも知れません.自分はかなり試行錯誤を繰り返したので,この記事がffmpegユーザーに役立てば幸いです.