ffmpegを使用した2つのビデオ間のクロスフェード


27

私はffmpegを使用して2つのビデオクリップ間でクロスフェードトランジションを達成しようとしましたが、今のところ失敗しました。私はffmpegが初めてであり、ほとんどの場合、オンラインでドキュメントや既存のサンプルで見つけることができるものを微調整することに依存しています。これまで読んだことから、ブレンドフィルターまたはオーバーレイフィルターのいずれかを使用すると、目的を達成するのに役立ちますが、コマンドラインの詳細を把握して機能させることはできません。

フェードと連結フィルタが最適ですビデオ1のフェードアウト、フェードインビデオ2へと連結2 1にクリップタイプの移行が、私はどんなことなく、映像1から映像2への移行にコマンドを得ることに助けをいただければと思います間に黒になります。私はどこでもこの問題の正確な例を見つけることができませんでした、おそらく間違ったキーワードを探しています...?

もっと具体的に言うと、私のビデオはmp4(h264ビデオ、重要な場合は音なし)で、それぞれ5秒の長さで、約1秒からの移行後です。4.5秒のビデオ1〜0.5秒のビデオ2。

MLTとフレームを使用してこのチュートリアルで行うことと同様(フェードの例については2:25を参照)、他のプログラムを呼び出さずにffmpegでこれを行う方法を探しています。 http://www.youtube.com/watch?v=3PRZ9L_KLdI

このようなフェードを取得するためのポインターまたはコマンドラインは、ありがたいことに感謝します!


回答:


23

そのようにすることをお勧めします:

  • 出力ビデオと同じ長さと解像度で黒の背景を作成します
  • 各ビデオにアルファチャンネルを追加する
  • 各ビデオにアルファ効果にフェードを追加
  • 背景が黒の各ビデオでオーバーレイを使用する

したがって、クロスフェードを2つのビデオ(5秒)に追加するコマンドはそれぞれ次のようになります。

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

これにより、最初のビデオが1秒(d = 1)の間4秒(st = 4)にアルファにフェードアウトし、1秒(d = 1)の間0秒(st = 0)に2番目にフェードインし、その表示を移動します4秒(+ 4 / TB)まで進みます。次に、9秒の黒い色を切り取り、出力ビデオサイズに合わせて拡大縮小し、オーバーレイします。

それが役に立てば幸い。


こんにちは、@ ptQa、ありがとうございます。クロスフェード効果は魅力のように機能します。出力ビデオで何が起こるかは、元のビデオの左上のセクションのみが表示され、フレームの残りが欠落していることです。私は解像度を見て、入力は960 x 720、出力は320 x 240ですが、ビデオ全体を縮小せず、代わりに左上の320 x 240セクションを切り取り、出力ビデオに残りの部分を示しています入力ビデオがありません。これを防ぐコマンドラインへの追加はありますか?
ムグバ14

ああ、私はそれを得た、あなたもあなたが取得したい解像度に黒い色をスケーリングする必要があります。更新された回答を参照してください。フィルターグラフにスケールを追加しました。
ptQa 14

それで解決しました、ありがとう。youtu.be/JqorgXAjjTo
Mugba 14

同じ問題。私は自分のビデオのいくつかでこれの変形を行っています-ありがとう。質問:ビデオフェードと同じパターンに従って、ビデオのオーディオトラックをクロスフェードするために、これをどのように変更しますか?
ジム・ミラー

1
ところで、答えのサンプルコマンドにエラーがあると思います-i 1.mp4 -i 2.mp4...
ジム・ミラー

7

これは私がやった方法です:

  • ffmpegバージョンN-77197-gdf2ce13
  • 各4秒の2本のビデオ。
  • それらの間でフェードでそれに参加する必要があります。
  • ビデオは25 fpsです。

1)1番目の終わりにフェードアウト(明るいから暗い)を追加し、2番目の初めにフェードイン(暗いから明るい)を追加します。

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24は、フェードアウトがフレーム76を開始し、24フレーム後に終了する= 1秒のフェードアウトを意味します。

0:25は、フェードインがフレーム0を開始し、25フレーム後に終了することを意味します。

2)2つのビデオを統合する

すべてをTSに変換

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

マージ

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

おかげで:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php


6
これはクロスフェードではありません。
ギャン

4
@Mulvyaが言ったこと。クロスフェードは、別のクリップがフェードインすると同時に1つのクリップをフェードアウトします。最初のクリップの透明度は、クロスフェードの継続時間にわたって着実に増加します。2番目の透明度は着実に低下しています。
直観

7

ffmpeg-concatは、目的を達成するための最も簡単な方法であり、多数のセクシーなOpenGLトランジションを使用できます。デフォルトはクロスフェードです。

ffmpeg-gl-transitionは、GLSLを使用して2つのビデオストリーム間をスムーズに移行できるカスタムffmpegフィルターです。このフィルターは、ここにリストされている代替手段よりも使用とカスタマイズが非常に簡単です。

このフィルタは、デフォルトでクロスフェードのトランジションタイプの大きなリストをサポートします。

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4

4
FFmpegへのパッチの提出を検討しましたか?
llogan

1
私は間違いなく、いくつかの小さな問題を修正し、最初にさらにテストする必要があります。いいね!
fisch2

これは公式FFmpegにありますか?見つけることができないようです
kraftydevil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.