FFmpegでビデオクロスフェードを行う効率的な方法は何ですか?


11

FFmpegでは、2つのビデオコンテンツ間でクロスフェードを行うのは実際にはかなり複雑です。オーディオ用の「クロスフェード」フィルターはありません。

それを行うための効率的な方法は何ですか?


いい答えの質問です!
JakeGould、2015年

この答えは、より多くの賛成票を獲得する必要があります...マーク、あなたもオーディオにクロスフェードを追加した場合、私はあなたを永遠に愛します...
Merc

方法がわかったらすぐに追加します。オーディオクロスフェードは簡単だと思いますが、簡単なフィルターがあると信じています。
Mark Gerolimatos

[0:a][1:a] acrossfade=d=1 [audio]はフィルターに追加し、次に-map "[audio]" コマンドに追加しただけで機能しました。必要に応じて、テストして答えを更新してください。
Merc

回答:


17

TL; DRバージョン:

この例では、両方のビデオクリップが同じ解像度、フレームレートなどであると想定して、ビデオのみを実行します。これにより、fadeoutclipとfadeinclipの間に1秒のフェードインが作成されます。fadeoutclipの長さが10秒であると仮定します。これは明確にするためにフォーマットされていることに注意してください。これは実際には1行のコードです。

ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an \
-filter_complex "\
    [0:v]trim=start=0:end=9,setpts=PTS-STARTPTS[firstclip]; \
    [1:v]trim=start=1,setpts=PTS-STARTPTS[secondclip]; \
    [0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
    [1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
    [fadeinsrc]format=pix_fmts=yuva420p, \
                fade=t=in:st=0:d=1:alpha=1[fadein]; \
    [fadeoutsrc]format=pix_fmts=yuva420p, \
                fade=t=out:st=0:d=1:alpha=1[fadeout]; \
    [fadein]fifo[fadeinfifo]; \
    [fadeout]fifo[fadeoutfifo]; \
    [fadeoutfifo][fadeinfifo]overlay[crossfade]; \
    [firstclip][crossfade][secondclip]concat=n=3[output] \
    " \
-map "[output]" <add in encoding part here>

完全版:

これがすべてについての説明です:

入力仕様...自明

ffmpeg -i fadeoutclip.mp4 -i fadeinclip.mp4 -an

作成filter_complex フィルター複合体をすでに理解していると仮定します。

-filter_complex

まず、トリムフィルターを使用して、2つのストリームをそれぞれ2つの部分に分割しますコンテンツとクロスフェードセクションです。フェードアウトはコンテンツとフェードセクションに分割され、フェードインはフェードセクションとコンテンツにカットされます。合計4つのセクション。

注厳密にすることを、私たちはしていない持っているから、クロスフェード区間を破るために:私たちは2つのビデオクリップのための時間のフェードアウトとフェードを指定することもできます。ただし、これを行うことにより、次のことが可能になります。

  • GUIビデオエディターで通常使用される方法論に従う
  • overlayフィルターの使用の煩わしい複雑さを回避する
  • ソリューションが可能な限り一般的であることを確認してください(つまり、再利用可能なコード)
  • 必要に応じてクロスフェードセクションの前処理と後処理を許可します(ここでは行いません)

これらの4つのセクションはそれぞれ、開始時間(秒)、終了時間(秒)、および本質的に各ビデオサブクリップを0秒から開始させる不思議なsetpts=PTS-STARTPTSフィルターを指定します。これは、それらを再合成するときに重要です。

s=0指定子は冗長であり、指定子のsetptsフィルターも冗長であることに注意してくださいs=0。ただし、両方とも冗長に指定されているため、フィルター複合体を壊すことなく、開始時刻を0から変更できます。また、2番目のコンテンツクリップは最後まで実行されるため、e=パート(end =)は指定されていません。

    [0:v]trim=s=0:e=9,setpts=PTS-STARTPTS[firstclip];
    [1:v]trim=s=1,setpts=PTS-STARTPTS[secondclip];
    [0:v]trim=s=9:e=10,setpts=PTS-STARTPTS[fadeoutsrc];
    [1:v]trim=s=0:e=1,setpts=PTS-STARTPTS[fadeinsrc];

次に、フェードインとフェードアウトを指定します。まず、ピクセル形式をに指定して、yuva420p両方のフェードセクションにアルファ(透明度)チャネルを追加します。実際には、アルファチャネルを提供する任意の形式を使用できます。

次に、このフィルターサブコンプレックスで、フェードアウトとフェードインの1つを指定します。これalpha=1は、ビデオ自体が暗くならず、透明度の量だけが「フェード」することを意味します。st開始をd意味し、期間を意味します。

    [fadeinsrc]format=pix_fmts=yuva420p,      
                fade=t=in:st=0:d=1:alpha=1[fadein];
    [fadeoutsrc]format=pix_fmts=yuva420p,
                fade=t=out:st=0:d=1:alpha=1[fadeout];

この?:何ですか フィルタ複雑なフィルタで使用可能なバッファスペースがあることを保証しますが。驚くべきことに、これはデフォルトではありません。これを行わないと、上のステージの出力が下のオーバーレイフィルターをオーバーランすると、クロスフェードが失敗する可能性があります。ええ、私はあなたが今何を考えているか知っています。確かにFFMPEGのバグです。fifo

    [fadein]fifo[fadeinfifo];
    [fadeout]fifo[fadeoutfifo];

ここで、2つのフェードセクションをオーバーレイします。2つのクロスフェードセクションが同じサイズであることを確認することで、オーバーレイフィルターが取るかなり厄介なオプションを心配する必要がなくなります(ここでは無視します)。

    [fadeoutfifo][fadeinfifo]overlay[crossfade];

最後に、concatフィルターを使用して3つのセグメントを並べます

    [firstclip][crossfade][secondclip]concat=n=3[output]

次に、出力パッドをビデオソースとしてマップします。

忘れない WHAT YOU通常使用する(典型的にはピクセルフォーマットを設定するためにyuv420pクロスフェードセクションでは、それを設定しているように、)yuv420出力チャネルに!(私たちはそれを指定しなかったので、オーバーレイ引数を使用できます)もちろん、あなたが望むならyuv420、あなたは大丈夫です:-)

-map "[output]" <add your normal encoding part here>

後でオーディオを再結合できます(このQ&Aの範囲外)。


1
最新のffmpegのでは、それがあることが必要trim=start=0:end=9ではなく、(、trim=st=0:e=9,...
傭兵

しかし真剣に、これは私がこれまでに見たFFMPEGの最良の答えであり、これまでで最も明確なffmpegの説明でなければなりません。
傭兵

男、それは私の頭に行きます:-)小道具をありがとう!!!!
Mark Gerolimatos

心配ない。現時点では最新のffmpegでは機能しないため、= trim = start = 0を使用して回答を更新してください
Merc

最新のffmpegバージョンではFilter setpts has an unconnected output、スクリプトに対して次のエラーが発生します。トリムパラメータを開始と終了に変更しました。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.