web-dev-qa-db-ja.com

FFmpegで多くのオーディオファイルを1つにクロスフェードしますか?

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つの入力ファイルだけをクロスフェードする例はありますか?それから、より長いチェーンのフィルターグラフを自動化することができました。

ヒントをありがとう!

1
setouk

フィルタは生のサンプルデータを処理し、同じものを出力します。デコードはデータがフィルターに送信される前に行われ、エンコードはすべてのフィルター処理が行われた後に行われます。したがって、フィルターがデータの一部を変更しない場合、その部分はそのまま残ります。

コマンドでは、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
6
Gyan