お題:Twitch で配信した録画からハイライトシーンを作成して、それにBGMとイントロのロゴを付けたい
いわゆる Montage Video というのを作りたくなったので、手持ちのソフトで可能かどうかやってみた。ffmpeg が入っているのでこれを使う。 ハイライトシーンは Twitch のダイジェスト編集で作成したものをダウンロードする。BGMは著作権フリーもしくはCreativeCommonsのものを拾ってくる。
まずは作業用の中間ファイルとして mp4 → huffyuv(mkv) に変換。
イントロのロゴは GIMP で PNG 作った。これを中間ファイルの先頭から差し込み、フェードアウトさせる。fade=out:st=2:d=3:alpha=1 と書いてある部分がフェードアウトの処理で、開始2秒の時点で3秒かけてフェードアウトする。
ffmpeg -i work.mkv -loop 1 -i intro.png -filter_complex "[1]format=yuva420p,lut=a='val*0.9',fade=out:st=2:d=3:alpha=1[a];[0][a] overlay=(W-w)/2:(H-h)/2:shortest=1" -movflags +faststart -c:v huffyuv -c:a copy work_with_intro.mkv
動画の最後をフェードアウトさせる。
ffmpeg -i work_with_intro.mkv -vf "fade=t=out:st=xx:d=5" fadeout.mkv
動画の終わりに合わせて BGM もフェードアウトさせたい場合はオーディオ用のフェードアウトをかける。afade=out:st=xx:d=5 と書いてある部分がフェードアウトの処理で、開始 xx 秒の時点で5秒かけてフェードアウトする。
ffmpeg -i audio.mp3 -af "afade=out:st=xx:d=5" fadeout.mp3
動画とBGMを結合する。(動画のオーディオチャンネルをBGMで上書きする)
ffmpeg -i fadeout.mkv -i fadeout.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
BGM が動画より長い場合は上記コマンドをちょっと変更して尺の調整をする。yy が動画の長さ(単位:秒)。
ffmpeg -ss 0 -i fadeout.mkv -i fadeout.mp3 -t yy -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 output.mp4
実際に出来上がったのがこちら。
追記:
上記コマンドを1個にまとめるとこうなった。
ffmpeg
-ss 0 ← BGM尺調整用
-i input.mp4 ← メインとなる動画
-loop 1
-i intro.png ← オープニングのロゴ(透過PNG)
-i bgm.mp3 ← BGM
-t 動画の秒数 ← BGMが動画より長い場合はこのオプションでBGMの尺を調整する
-filter_complex "[1]format=yuva420p,lut=a='val*0.9',fade=out:st=3:d=2:alpha=1[a]; ← ロゴを開始3秒後(st=3)から2秒(d=2)かけてフェードアウトさせる
[0][a] overlay=(W-w)/2:(H-h)/2:shortest=1[b]; ← 動画にフェードアウトするロゴを合成する
[b]fade=t=out:st=フェードアウト開始位置(秒):d=3[c]" ← 動画の最後を3秒(d=3)かけてフェードアウトさせる
-map "[c]:v:0" ← filter_complex の処理結果を動画出力する
-map "2:a:0" ← BGM を音声出力する(2 は -i で指定した引数(0から始まる)の2番目の意味)
-movflags +faststart ← おまじない。これがあるとすぐに再生が始まる
-pix_fmt yuvj420p ← 出力フォーマット1(yuvj420p)
-c:v libx264 ← 出力フォーマット2(H.264)
-crf 20 ← H.264 の画質設定(低いほど高い)
output.mp4 ← 出力ファイル名