Sox:连接多个音频文件,两者之间没有间隙

时间:2014-08-13 08:00:15

标签: audio concatenation sox

我使用SoX

连接多个(最多25个)音频文件
sox first.mp3 second.mp3 third.mp3 result.mp3

它做了它应该做的事情;将给定文件连接到一个文件中。但不幸的是,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)在连接文件之间的延迟非常小。任何想法都非常感激。

3 个答案:

答案 0 :(得分:7)

最好 - 尽管没有帮助 - 这样做的方法是不要使用MP3文件作为源文件。 WAV,FLAC或M4A文件没有这个问题。

MP3不是由固定费率的样本组成的,因此裁剪出任意长度的部分将无法正常工作。除非编码器是智能的(如跛脚),否则MP3文件音频的开头或结尾通常会有间隙。我做了0.98s样本的测试(正好是73½CDDA帧,许多MP3编码器使用帧来获得最小样本长度)。然后我用三种不同的MP3编码器(lame,sox和古代shine)对样本进行编码,然后用三个解码器(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编码的所有内容都会以微小的间隙结束。因此,加入文件将导致微小的点击。

您的浏览器可能会轻微混合和重叠源文件,因此您无法听到咔嗒声。 Gapless playback很难正确完成。

答案 1 :(得分:6)

这是我对您的问题的猜测:

  • sox在串联期间不会增加时间间隔,
  • 但是它会在其他操作中添加时间间隔,例如,如果在连接之前进行转换。

要了解发生了什么,我建议您每次检查文件的所有持续时间(例如,您可以使用soxi)来查看正在进行的操作。

如果它不起作用(在连接期间添加时间间隔),请允许我再做一次猜测:

  • Sox增加时间间隔,因为文件开头或结尾的样本不接近零。

要解决此问题,您可以使用非常短的淡入淡出文件。

此外,要强制sox输出具有明确定义长度的文件,您可以使用trim参数,如下所示:

sox filein.mp3 trim 0 duration fileout.mp3

答案 2 :(得分:1)

首先你需要检查文件的开头和结尾是否没有静音,我不知道sox是否可以做到但你需要检查开始和结束音频信号的能量(rms,dB)并切断开始并且结束沉默,要加入无间隙的音频文件,您需要在信号中应用一个窗口函数,使其像fadein / fadeout一样工作,然后在另一个的结尾处交叉淡入淡出。

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.

检查文档here