web-dev-qa-db-ja.com

(ゼロが埋め込まれていない)数値の順序を保持しながら、一連の.wavファイルを追加するにはどうすればよいですか?

1つにマージしたい多くの(7500).wavファイル(番号で名前が付けられています)があります。グロブを使用すると一部のファイルの順序が間違ってしまうため(2の前の1111など)、bashループを使用して実行する必要があると思います。

Linuxでこれを行うための最良の方法は何ですか?

7
Neula

すべてのファイルにサンプルレートやチャンネル数などの同じパラメータがある場合でも、それらを単に連結することはできません。 WAVヘッダーを取り除く必要があります。

soxのようなオーディオファイル操作ユーティリティを使用するのが最も簡単かもしれません。これには、ファイルを連結するためのメソッドが含まれています。実際、これはデフォルトで行われます。例えば。 3つの.wavファイルを1つの長いファイルに結合するには:

$ sox short1.wav short2.wav short3.wav long.wav

ループは、ファイルを希望の順序で配置しません。必要なのは名前を並べ替えることですが、数値で扱います。 sort -nがこれを行います。

したがって:

$ sox $(ls *.wav | sort -n) out.wav

soxがその数のファイルを処理できない場合は、次のようにジョブを分割できます。

$ ls *.wav | sort -n > script

次に、次のようなスクリプトファイルがあります。

1.wav
2.wav
...
3999.wav
4000.wav
...
file7500.wav

これを編集して、いくつかのコマンドラインを作成します。

# catenate about half the files to temp1.wav   
sox \
1.wav \
2.wav \
... \
3999.wav \
temp1.wav

# catenate the remainder to temp2.wav  
sox \
4000.wav \
... \
7500.wav \
temp2.wav

# catenate the two halves
sox temp1.wav temp2.wav out.wav ; rm temp1.wav temp2.wav

ファイルリストの最初の編集手順として、viコマンド:%s/.*/& \\/を使用して、すべての行の後に円記号を追加できます。

14
Kaz