web-dev-qa-db-ja.com

Sox:間にギャップなしで複数のオーディオファイルを連結します

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)には、連結されたファイル間でこれまでにないわずかな遅延があります。どんなアイデアも本当にありがたいです。

11
trainoasis

これはあなたの問題に対する私の推測です:

  • soxは、連結中に時間ギャップを追加しません。
  • ただし、連結の前に変換を行う場合など、他の操作にタイムギャップが追加されます。

何が起こっているのかを知るために、毎回ファイルのすべての期間をチェックして(たとえば、soxiを使用できます)、何が起こっているのかを確認することをお勧めします。

それが機能しない場合(連結中にタイムギャップが追加されます)、別の推測をしてみましょう:

  • ファイルの最初または最後のサンプルがゼロに近くないため、Soxは時間ギャップを追加します。

これを解決するには、ファイルに非常に短いフェードインフェードアウトを使用できます。

さらに、soxに明確に定義された長さのファイルを出力させるには、次のようなトリムパラメーターを使用できます。

sox filein.mp3 trim 0 duration fileout.mp3
6
PatriceG

これを行うための最良の(最も役に立たない)方法は、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によってエンコードされたものはすべて小さなギャップになってしまいました。したがって、ファイルを結合すると、小さなクリックが発生します。

ブラウザがソースファイルをわずかに混合してオーバーラップしている可能性があるため、クリック音は聞こえません。 ギャップレス再生 正しく行うのは難しいです。

9
scruss

まず、ファイルの開始と終了に無音がないかどうかを実際に確認する必要があります。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.

ドキュメントを確認してください ここ

1
ederwander