SoX を使用して複数(最大25)のオーディオファイルを連結しています
sox first.mp3 second.mp3 third.mp3 result.mp3
それが想定されていることを行います。指定されたファイルを1つのファイルに連結します。しかし残念ながら、result.mp3のこれらのファイルの間には小さなタイムギャップがあります。このギャップを取り除く方法はありますか?
複数のオーディオ(同じ長さ/フォーマット/レート)をマージして連結する前に、first.mp3、second.mp3などを作成しています。
sox -m drums.mp3 bass.mp3 guitar.mp3 first.mp3
これらすべてのファイルにタイムギャップが追加されていないことを確認して確認するにはどうすればよいですか? (マージおよび連結)
連結されたすべてのファイルをシームレスに再生する必要があります(ブラウザーで次々に再生すると、問題なく動作します)。
助けてくれてありがとう。
編集:
私が実行しているコマンドの正確な例(実際のファイル名なし)は次のとおりです。
sox "|sox -m file1.mp3 file2.mp3 file3.mp3 file4.mp3 -p" "|sox -m file1.mp3 file6.mp3 file7.mp3 -p" "|sox -m file5.mp3 file6.mp3 file4.mp3 -p" "|sox -m file0.mp3 file2.mp3 file9.mp3 -p" "|sox -m file1.mp3 file15.mp3 file4.mp3 -p" result.mp3
これにより、ファイルがマージされ、連結コマンドに直接パイプされます。結果のmp3(result.mp3)には、連結されたファイル間でこれまでにないわずかな遅延があります。どんなアイデアも本当にありがたいです。
これはあなたの問題に対する私の推測です:
何が起こっているのかを知るために、毎回ファイルのすべての期間をチェックして(たとえば、soxiを使用できます)、何が起こっているのかを確認することをお勧めします。
それが機能しない場合(連結中にタイムギャップが追加されます)、別の推測をしてみましょう:
これを解決するには、ファイルに非常に短いフェードインフェードアウトを使用できます。
さらに、soxに明確に定義された長さのファイルを出力させるには、次のようなトリムパラメーターを使用できます。
sox filein.mp3 trim 0 duration fileout.mp3
これを行うための最良の(最も役に立たない)方法は、MP3ファイルをソースファイルとして使用しないことです。 WAV、FLAC、またはM4Aファイルにはこの問題はありません。
MP3は固定レートのサンプルで構成されていないため、任意の長さのセクションを切り抜くことは期待どおりに機能しません。エンコーダーがスマートでない限り(ラメのように)、MP3ファイルのオーディオの最初または最後にギャップがあることがよくあります。私は0.98秒の長さのサンプルでテストを行いました(正確には73½CDDAフレームであり、多くのMP3エンコーダーは最小サンプル長にフレームを使用します)。次に、サンプルを3つの異なるMP3エンコーダー(lame、sox、および古代の shine )でエンコードし、次にそれらのファイルを3つのデコーダー(lame、sox、およびmadplay)でデコードしました。サンプルの長さを元の長さと比較すると、次のようになります。
Enc.→Dec. Length Samples CDDA Frames
----------------- --------- ------- -----------
shine→lame 0.95" 42095 71.5901
shine→madplay 0.97" 42624 72.4898
shine→sox 0.97" 42624 72.4898
lame→lame 0.98" 43218 73.5000
*Original 0.98" 43218 73.5000
sox→sox 0.99" 43776 74.4490
sox→lame 1.01" 44399 75.5085
lame→madplay 1.02" 44928 76.4082
lame→sox 1.02" 44928 76.4082
sox→madplay 1.02" 44928 76.4082
Lameによってエンコードおよびデコードされたファイルのみが同じ長さになりました(主に、lameはこれらの短すぎるサンプルを修正するために長さタグを挿入し、それをデコードする方法を知っているためです)。私がどのデコーダーを使用したかに関係なく、soxによってエンコードされたものはすべて小さなギャップになってしまいました。したがって、ファイルを結合すると、小さなクリックが発生します。
ブラウザがソースファイルをわずかに混合してオーバーラップしている可能性があるため、クリック音は聞こえません。 ギャップレス再生 正しく行うのは難しいです。
まず、ファイルの開始と終了に無音がないかどうかを実際に確認する必要があります。soxでそれができるかどうかはわかりませんが、開始と終了のオーディオ信号のエネルギー(rms、dB)を確認し、開始と終了の無音をカットする必要があります。 、ギャップなしでオーディオファイルを結合するには、信号に1つのウィンドウ関数を適用して、フェードイン/フェードアウトのように機能させてから、一方の始まりともう一方の終わりをクロスフェードする必要があります。
soxは、クロスフェードするためのsplice
関数を提供します。
splice [−h|−t|−q] { position[,excess[,leeway]] }
Splice together audio sections. This effect provides two things over simple audio concatenation: a (usually short) cross-fade is applied at the join, and a wave similarity comparison is made to help determine the best place at which to make the join.
ドキュメントを確認してください ここ