Askthewind’s diary

個人的なメモ

FFmpegで動画と画像をブレンド合成して透過する

Blend video and image and opacity into each other

 

overlay mode

f:id:Askthewind:20181222130652g:plain

FFmpegでプレビュー

ffmpeg -i input.mp4 -i input.png -filter_complex "[0][1]blend=all_mode='overlay':all_opacity=0.7" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input.mp4 -i input.png -filter_complex "[0][1]blend=all_mode='overlay':all_opacity=0.7" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 
[0][1]blend=all_mode='overlay':all_opacity=0.9で一番目に入力した動画input.mp4と二番目に入力したpng画像input.pngをblendで使えるオプションall_modeにall_modeで使えるオプションヴァリューoverlayを設定してブレンドした後、動画全体を透過しています。blend=all_modeでブレンド合成する動画と画像は同じ解像度である必要があります。

 

lighten mode

f:id:Askthewind:20181222130909g:plain

FFmpegで動画と画像をブレンド合成して透過する。lighten mode

FFmpegでプレビュー

ffmpeg -i input.mp4 -i input.png -filter_complex "[0][1]blend=all_mode='lighten':all_opacity=0.9" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input.mp4 -i input.png -filter_complex "[0][1]blend=all_mode='lighten':all_opacity=0.9" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 

FFmpegで解像度の違う動画と画像をリサイズしてブレンド合成して透過する。overlay mode

FFmpegでプレビュー

ffmpeg -i input.mp4 -i input.png -filter_complex "[1][0]scale2ref[a][b];[b][a]blend=all_mode='overlay':all_opacity=0.7" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input.mp4 -i input.png -filter_complex "[1][0]scale2ref[a][b];[b][a]blend=all_mode='overlay':all_opacity=0.7" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 

[1][0]scale2ref[a][b];で2番目に入力したpng画像input.pngを1番目に入力した動画input.mp4と同じ解像度にリサイズして[a][b]という任意の名前をつけています。blend=all_modeでブレンド合成する動画は同じ解像度である必要があります。

[b][a]blend=all_mode='overlay':all_opacity=0.7で一番目に入力した動画input.mp4と二番目に入力したpng画像input.pngをblendで使えるオプションall_modeにall_modeで使えるオプションヴァリューoverlayを設定してブレンドした後、動画全体を透過しています。

 

FFmpegで動画と画像をリサイズしてブレンド合成して透過する。lighten mode

FFmpegでプレビュー

ffmpeg -i input.mp4 -i input.png -filter_complex "[0]scale=hd1080:flags=lanczos+accurate_rnd[a],[1]scale=hd1080:flags=lanczos+accurate_rnd[b],[a][b]blend=all_mode='lighten':all_opacity=0.9" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input.mp4 -i input.png -filter_complex "[0]scale=hd1080:flags=lanczos+accurate_rnd[a],[1]scale=hd1080:flags=lanczos+accurate_rnd[b],[a][b]blend=all_mode='lighten':all_opacity=0.9" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 

[0]scale=hd1080:flags=lanczos+accurate_rnd[a],で一番目に入力した動画input.mp4を拡大縮小のアルゴリズムオプションにlanczos+accurate_rndを指定して、1920x1080(FullHD)サイズにリサイズをして[a]という任意の名前をつけています。

[1]scale=hd1080:flags=lanczos+accurate_rnd[b],で二番目に入力したpng画像input.pngを拡大縮小のアルゴリズムオプションにlanczos+accurate_rndを指定して、1920x1080(FullHD)サイズにリサイズをして[b]という任意の名前をつけています。

[a][b]blend=all_mode='lighten':all_opacity=0.9で一番目に入力した動画input.mp4と二番目に入力したpng画像input.pngをblendで使えるオプションall_modeにall_modeで使えるオプションヴァリューlightenを設定してブレンドした後、動画全体を透過しています。blend=all_modeでブレンド合成する動画は同じ解像度である必要があります。

 

Transmits images and combines them with moving images

f:id:Askthewind:20181222132945g:plain

FFmpegで画像を透過して動画と合成する。

FFmpegでプレビュー

ffmpeg -i input.mp4 -i input.png -filter_complex "[1]format=rgba,colorchannelmixer=aa=0.5[a];[0][a]overlay=enable='between(t,0,6)',format=yuv420p" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input.mp4 -i input.png -filter_complex "[1]format=rgba,colorchannelmixer=aa=0.5[a];[0][a]overlay=enable='between(t,0,6)'" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 

[1]format=rgba,で二番目に入力したpng画像をcolorchannelmixerで透過したいため、アルファ(透過)チャンネル付きのRGBフォーマット形式に変換しています。

colorchannelmixer=aa=0.5[a];でpng画像input.pngを透過して[a]という任意の名前をつけています。

[0][a]overlay=enable='between(t,0,6)'で一番目に入力した動画input.mp4と[a](透過したpng画像input.png)を合成して、出力する合成時間の指定をしています。overlayで合成する動画と画像は同じ解像度である必要はありません。ここでは同じ解像度の動画と画像を合成しています。

,format=yuv420pで合成した動画の出力を他のデバイスでも再生できるようにyuv420pで指定しています。

 

Scaling 2movies, blend and opacity overlay mode

f:id:Askthewind:20181222133244g:plain

FFmpegで2入力した動画をリサイズしてブレンド合成して透過する。overlay mode

FFmpegでプレビュー

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[a],[1]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[b],[a][b]blend=all_mode='overlay':all_opacity=0.7" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[a],[1]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[b],[a][b]blend=all_mode='overlay':all_opacity=0.7" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 

[0]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[a],で一番目に入力した動画input1.mp4に出力ピクセルアスペクト比を入力ピクセルアスペクト比と同じになるように設定して拡大縮小のアルゴリズムオプションにlanczos+accurate_rndを指定してアスペクト比を保ったまま1280x720(HD)にリサイズして[a]という任意の名前をつけています。

[1]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[b],で二番目に入力した動画input2.mp4に出力ピクセルアスペクト比を入力ピクセルアスペクト比と同じになるように設定して拡大縮小のアルゴリズムオプションにlanczos+accurate_rndを指定してアスペクト比を保ったまま1280x720(HD)にリサイズして[b]という任意の名前をつけています。

[a][b]blend=all_mode='overlay':all_opacity=0.7で一番目に入力した動画input1.mp4と二番目に入力した動画input2.mp4をblendで使えるオプションall_modeにall_modeで使えるオプションヴァリューoverlayを設定してブレンドした後、動画全体を透過しています。blend=all_modeでブレンド合成する動画は同じ解像度である必要があります。

 

Scaling 2movies, blend and opacity lighten mode

f:id:Askthewind:20181222135838g:plain

FFmpegで2入力した動画をリサイズしてブレンド合成して透過する。lighten mode

FFmpegでプレビュー

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[a],[1]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[b],[a][b]blend=all_mode='lighten':all_opacity=0.9" -f matroska - | ffplay -i -

FFmpegエンコード

ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "[0]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[a],[1]setsar=sar=1,scale=hd720:flags=lanczos+accurate_rnd[b],[a][b]blend=all_mode='lighten':all_opacity=0.9" -movflags +faststart -pix_fmt yuv420p -c:v libx264 -crf 20 "output.mp4"
 
 
使用した動画素材はNHKクリエイティブライブラリー様からお借りしました。

www.nhk.or.jp

 

参考にさせていただきました。Special Thanks

superuser.com

stackoverflow.com


stackoverflow.com

Also see


www.ffmpeg.org