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

tra*_*sis 10 audio concatenation sox

我使用的是连结多个(最多25个)的音频文件SOX

sox first.mp3 second.mp3 third.mp3 result.mp3
Run Code Online (Sandbox Code Playgroud)

它做了它应该做的事情; 将给定文件连接到一个文件中.但不幸的是,result.mp3中的这些文件之间存在小的时间差.有没有办法消除这种差距?

我创建first.mp3,second.mp3等等,然后通过合并多个音频(相同的长度/格式/速率)连接它们:

sox -m drums.mp3 bass.mp3 guitar.mp3 first.mp3
Run Code Online (Sandbox Code Playgroud)

如何检查并确保所有这些文件都没有添加时间间隔?(合并和连接)

我需要实现所有连接文件的无缝播放(当它们在浏览器中一个接一个播放时,它可以正常工作).

感谢您的任何帮助.

编辑:

我正在运行的命令的确切示例(没有真正的文件名)现在是:

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
Run Code Online (Sandbox Code Playgroud)

这将合并文件并将它们直接管道连接到连接命令.产生的mp3(result.mp3)在连接文件之间的延迟非常小.任何想法真的很感激.

scr*_*uss 9

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

MP3不是由固定速率的样本组成,因此裁剪出任意长度的部分将无法按预期工作.除非编码器是智能的(如跛脚),否则MP3文件音频的开头或结尾通常会有间隙.我做了0.98s样本的测试(正好是73½CDDA帧,许多MP3编码器使用帧来获得最小样本长度).然后我用三种不同的MP3编码器(lame,sox和古代闪光)对样本进行编码,然后使用三个解码器(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
Run Code Online (Sandbox Code Playgroud)

只有由lame编码和解码的文件才能达到相同的长度(主要是因为lame插入一个长度标签来校正这些太短的样本,并知道如何解码它).无论我使用什么解码器,sox编码的所有内容都会以微小的间隙结束.因此,加入文件将导致微小的点击.

您的浏览器可能会轻微混合和重叠源文件,因此您不会听到咔嗒声.无缝播放很难正确完成.


Pat*_*ceG 6

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

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

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

如果它不起作用(在连接期间添加时间间隔),请让我做另一个猜测:

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

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

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

sox filein.mp3 trim 0 duration fileout.mp3
Run Code Online (Sandbox Code Playgroud)