如何在保留(非零填充)数字排序的同时附加一堆.wav文件?


7

我有很多(7500).wav文件(由他们的数字命名),我想合并为一个。我认为必须使用bash循环,因为使用globbing时,某些文件的顺序会错误(如2之前的1111)。

在Linux下执行此操作的最佳方法是什么?

Answers:


13

如果所有文件都具有相同的参数,例如采样率和通道数,那么您仍然无法对它们进行连接。你必须去除WAV标题。

使用音频文件操作实用程序可能是最简单的sox,它包含用于连接文件的方法。实际上,它默认情况下会这样做。例如,将三个.wav文件合并为一个长文件:

$ 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/.*/& \\/在每行之后添加反斜杠。


谢谢,这似乎是正确的方式,但似乎sox不超过6479.wav文件(退出“sox FAIL格式:无法打开输入文件`6479.wav':太多打开文件” ):-(
Neula

啊,在这种情况下,我们可以做的只是打破操作。例如,我们可以将文件列表分成两半,合并每一半然后合并一半。我会将输出捕获ls *.wav | sort -n到文件中,将列表转换为sox命令行,然后将其获取。
Kaz

1
保持所有文件同时打开看起来像是sox中的bug /缺陷。
Kaz

最后,它表明sox不会超过348个文件,所以我必须这样做21次。合并第一个文件时,我注意到它们似乎已损坏,因此将它们合并对我没有帮助。无论如何,你解决了这个问题!谢谢你
Neula 2013年

你的意思是原始文件已损坏?这太糟糕了。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.