FFmpegでは、2つのビデオコンテンツ間でクロスフェードを行うのは実際にはかなり複雑です。オーディオ用の「クロスフェード」フィルターはありません。
それを行うための効率的な方法は何ですか?
[0:a][1:a] acrossfade=d=1 [audio]
はフィルターに追加し、次に-map "[audio]"
コマンドに追加しただけで機能しました。必要に応じて、テストして答えを更新してください。
FFmpegでは、2つのビデオコンテンツ間でクロスフェードを行うのは実際にはかなり複雑です。オーディオ用の「クロスフェード」フィルターはありません。
それを行うための効率的な方法は何ですか?
[0:a][1:a] acrossfade=d=1 [audio]
はフィルターに追加し、次に-map "[audio]"
コマンドに追加しただけで機能しました。必要に応じて、テストして答えを更新してください。
回答:
この例では、両方のビデオクリップが同じ解像度、フレームレートなどであると想定して、ビデオのみを実行します。これにより、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つのビデオクリップのための時間のフェードアウトとフェードを指定することもできます。ただし、これを行うことにより、次のことが可能になります。
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の範囲外)。
trim=start=0:end=9
ではなく、(、trim=st=0:e=9,
...