FFmpegを使用して、多くのオーディオファイルを1つの長いファイルに結合し、それぞれの間にクロスフェードを設定しようとしています。数字を単純にするために、5分ごとに10個の入力ファイルがあり、それぞれの間に10秒のクロスフェードが必要だとします。 (結果の継続時間は48:30になります。)すべての入力ファイルが同じコーデック/ビットレートであると想定します。
2つのファイルをクロスフェードするのがいかに簡単であるかを知って嬉しい驚きを覚えました。
ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.mp3
ただし、acrossfade
フィルターは3つ以上の入力を許可しません。したがって、私の素朴な解決策は、ffmpeg
を繰り返し実行し、前の中間出力を次の入力ファイルとクロスフェードすることです。それは理想的ではありません。それは私に2つの質問につながります:
1。acrossfade
はストリームをロスレスでコピーしますか?(もちろん、アクティブにクロスフェードしている場合を除きます。)または、入力ストリーム全体が再エンコードされますか?
入力ストリームが完全に再エンコードされている場合、私の素朴なアプローチは非常に悪いです。上記の例(acrossfade
を9回呼び出す)では、最初のファイルの最初の4:50が9回再エンコードされます。 50個のファイルを組み合わせると、最初のファイルは49回再エンコードされます。
2。複数の実行と再エンコードの問題を回避するために、1回のffmpeg
呼び出しで複数のクロスフェード動作を実現できますか?
長いフィルターグラフが必要になると思いますが、まだわかりません。 3つの入力ファイルだけをクロスフェードする例はありますか?それから、より長いチェーンのフィルターグラフを自動化することができました。
ヒントをありがとう!
フィルタは生のサンプルデータを処理し、同じものを出力します。デコードはデータがフィルターに送信される前に行われ、エンコードはすべてのフィルター処理が行われた後に行われます。したがって、フィルターがデータの一部を変更しない場合、その部分はそのまま残ります。
コマンドでは、MP3に出力しているので、これにより強制的に再エンコードされます。 WAVに出力することでそれを回避できます。
ffmpeg -i 0.mp3 -i 1.mp3 -vn -filter_complex acrossfade=d=10:c1=tri:c2=tri out.wav
最後のクロスフェードコマンドでMP3に出力できます。
1回の呼び出しですべてのクロスフェードを実行することもできます。
4つのファイルの例、
ffmpeg -i 0.mp3 -i 1.mp3 -i 2.mp3 -i 3.mp3 -vn
-filter_complex "[0][1]acrossfade=d=10:c1=tri:c2=tri[a01];
[a01][2]acrossfade=d=10:c1=tri:c2=tri[a02];
[a02][3]acrossfade=d=10:c1=tri:c2=tri"
out.mp3