我使用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)在连接文件之间的延迟非常小。任何想法都非常感激。
答案 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)
这是我对您的问题的猜测:
要了解发生了什么,我建议您每次检查文件的所有持续时间(例如,您可以使用soxi)来查看正在进行的操作。
如果它不起作用(在连接期间添加时间间隔),请允许我再做一次猜测:
要解决此问题,您可以使用非常短的淡入淡出文件。
此外,要强制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