我正在尝试使用 ffmpeg 连接 mp3 文件,但运气不佳。我有 100 个非常短的 0.05-2 秒 mp3 样本(发音字母),我想将它们合并到一个文件中,然后我可以跳转到特定位置以播放特定声音,而不是为每个样本设置单独的文件。当我按照这些说明进行连接时,声音之间似乎存在细微的间隙,因为我走得越远,它出现的距离就越远。
例如,我获取了每个单独的 mp3 文件,并使用this计算了它的持续时间。从那里我可以创建偏移量来开始播放,以及偏移量来停止播放,整个单个 mp3 文件中的每个样本。但是当我这样做时,更多的轨道会越来越多,告诉我每个轨道之间都有一个间隙。我怎样才能使这个过程准确?也就是说,我怎样才能毫无间隙地连接 100 首 mp3,这样我就可以准确计算出我应该开始和停止播放的曲目的哪个位置?
作为参考,我尝试了audio-joiner.com,曲目之间的间隙更大。
将 MP3 无间隙连接起来并非易事,不重新编码也不可能。
这背后的原因是,像大多数具有有损压缩的音频编解码器一样,MP3 包含预采样和设置间隙——基本上第一毫秒不能包含可听内容。
预录片段的语音合成通常使用 PCM 或专门设计的格式来避免上述问题。由于 MP3 压缩非常快,我建议您将片段保留为原始 PCM 格式 - 这样您就可以通过在文件或流的基础上连接它们来组合它们,并将组合结果转换为您需要的任何格式。
编辑
根据评论中的要求,这里有一个简短的操作方法(假设所有 WAV 文件都有 48K 采样率 16 位签名,立体声,如果不只是相应地适应的话):
将 WAV 转换为原始 PCM:
ffmpeg -i input.wav -c:a copy -vn -dn -sn -f s16le output.pcm
连接文件(显示的是 Linux,如果使用 Windows 则进行调整):
cat first.pcm second.pcm third.pcm > temp.pcm
将结果转换为 MP3(例如 192K,编解码器名称可能因您的构建而异):
ffmpeg -f s16le -ac 2 -ar 48000 -i temp.pcm -c:a mp3 -b:a 192K output.mp3