web-dev-qa-db-ja.com

ffmpegを使用して、静的背景画像の上に透明度のあるアニメーション画像をオーバーレイしますか?

私は、透明な背景とマージされた透明度を持つpng画像のセットを使用してビデオを作成しようとしています。

多くの掘り下げを行った後、フィルターライブラリを使用することでそれが間違いなく可能であるように思われます。

背景を含まない私の最初のビデオ作成は次のとおりです。

ffmpeg -y -qscale 1 -r 1 -b 9600 -loop -i bg.png -i frame_%d.png -s hd720 testvid.mp4

-vfを使用して、背景をオーバーレイとして適用できます。

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[in][wm] overlay=0:0 [out]" -s hd720 testvid.mp4

ただし、問題は入力の上に背景を重ねることです。一致 libacfilter 入力を分割して、そのコンテンツで遊ぶことができます。どういうわけかオーバーレイの順序を変更できるかどうか疑問に思っていますか?

どんな助けも大歓迎です!

更新1:
次のフィルターを機能させようとしていますが、背景なしで映画を取得しています:

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [bg]; [in] split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4

更新2:
-vfオプションを使用してビデオを作成した。入力スリットをパイプでつなぎ、画像を適用し、2つの分割フィードをオーバーレイしました!おそらく最も効率的な方法ではありません...しかしそれはうまくいきました!

ffmpeg -y -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png, scale=1280:720:0:0 [bg]; [in] format=rgb32, split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4
25
Jona

オーバーレイの順序は、 the ffmpeg docs の入力の順序によって制御されます

[...]は2つの入力と1つの出力を受け取ります。最初の入力は、2番目の入力がオーバーレイされる「メイン」ビデオです。

したがって、2番目のコマンドは次のようになります。

ffmpeg -y -loop 1 -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[wm][in] overlay=0:0" -s hd720 testvid.mp4

Ffmpegの最新バージョンでは、新しい-filter_complexコマンドにより、同じプロセスがさらに簡単になります。

ffmpeg -loop 1 -i bg.png -i frame_%d.png -filter_complex overlay -shortest testvid.mp4

完全に機能する例:

透明な入力画像のソース(ダンスの謝罪):
Dancing banana
ImageMagick でフレームに分解:

convert dancingbanana.gif -define png:color-type=6 over.png

(ffmpegはインデックス付き透明度を正しく処理しないため、png:color-type=6(RGB-Matte)の設定は重要です。)入力にはover-0.pngover-1.pngover-2.pngなどの名前が付けられます。

私たちの背景画像(バナナにスケーリング):
Happy little mountain

ffmpeg version N-40511-g66337bf(a git build 昨日から)を使用して、次のことを行います。

ffmpeg -loop 1 -i bg.png -r 5 -i over-%d.png -filter_complex overlay -shortest out.avi

-loopは、背景画像の入力をループするので、1つのフレームだけではなく、非常に重要です。
-rは、オプションで、踊るバナナを少し遅くします。
-filter_complexは、ごく最近追加されたffmpeg機能であり、複数の入力の処理を容易にします。
-shortestは、最短の入力が終了したときにエンコードを終了します。これは、バックグラウンドをループすることがその入力が決して終わらないことを意味するために必要です。

わずかに最先端のビルドを使用して、ffmpeg version 0.10.2.git-d3d5e84

ffmpeg -loop 1 -r 5 -i back.png -vf 'movie=over-%d.png [over], [in][over] overlay' -frames:v 8 out.avi

movieはレート設定を許可しないため、代わりに背景を遅くして同じ効果をもたらします。オーバーレイされたムービーは適切な入力ではないため、-shortestを使用できません。代わりに、出力するフレームの数をオーバーレイされた入力フレームの数に明示的に設定します。

最終結果(埋め込み用のgifとして出力):
Dancing banana with background

48
blahdiblah

2015年2月17日の将来の参照の場合、コマンドラインは次のとおりです。

ffmpeg -loop 1 -i images/background.png -i images/video_overlay%04d.png -filter_complex overlay=shortest=1 testvid.mp4

ここに返信してくれたlloganに感謝します: https://trac.ffmpeg.org/ticket/4315#comment:1

5
gabrielstuff