我在尝试着使用 ffmpeg 连接 mp3 文件运气不太好。我有 100 个非常短的 0.05-2 秒 mp3 样本(发音字母),我想将它们合并成一个文件,然后我可以跳转到特定位置播放特定的声音,而不是为每个样本创建单独的文件。当我按照这些说明进行连接时,声音之间似乎存在微小的间隙,因为我越往下走,声音似乎就越远。
例如,我获取了每个单独的 mp3 文件并使用以下方法计算其时长这。从那里我可以创建偏移量来开始播放,以及偏移量来停止播放整个单个 mp3 文件中的每个样本。但是当我这样做时,后面的音轨会越来越偏离,告诉我每个音轨之间都有间隙。我怎样才能让这个过程准确无误?也就是说,我怎样才能将 100 个 mp3 无缝连接起来,这样我就可以准确计算出我应该在音轨的哪个位置开始和停止播放?
作为参考,我尝试过audio-joiner.com并且轨道之间的间隙更大。
答案1
将 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