如何将两个 wav 文件合并/合并为一个 wav 文件?
Posted
技术标签:
【中文标题】如何将两个 wav 文件合并/合并为一个 wav 文件?【英文标题】:How do I combine/merge two wav files into one wav file? 【发布时间】:2010-04-05 14:28:24 【问题描述】:如何使用 java 合并两个 wav 文件?
我尝试了this,但它不能正常工作,他们还有其他方法吗?
【问题讨论】:
它为什么不能正常工作?出了什么问题? 结果文件太短了。您需要考虑到我尝试合并的每个文件都需要 1 秒甚至更少。也许这就是原因。 那么每个文件的长度是 1 秒还是更少?那么最大歌曲长度将是2秒?不是你在做的吗? 我想我知道问题出在哪里。如何在这两个文件之间添加 1 秒(或更多)的空音频? 【参考方案1】:如果您直接使用 wav 文件的字节,您可以在任何编程语言中使用相同的策略。对于此示例,我将假设两个源文件具有相同的比特率/numchannels 并且具有相同的长度/大小。 (如果不是,您可以在开始合并之前对其进行编辑)。
首先查看 wav 规范,我在 stanford 课程网站上找到了一个不错的:
常见的标头长度为 44 或 46 字节。
如果您想连接两个文件(即在一个文件中播放一个 wav,然后播放另一个):
-
找出你的wav文件是什么格式
剪掉前 44/46 个字节,即标题,文件的其余部分是数据
创建一个新文件并在其中粘贴其中一个标题。
新的 wav 文件 = header = 44/46 字节长
从原始文件中添加两个数据部分
新的 wav 文件 = header + data1 + data2 = 44/46 + size(data1) + size(data2) 字节长
在两个地方修改标题以反映新文件的长度。
一个。修改字节 4+4(即从偏移量 4 开始的 4 个字节)。 新值应该是一个十六进制数字,表示新 wav 文件的大小,以字节 44/46 + size(data1) + size(data2) - 8bytes 为单位。
b.修改字节 40+4 或 42+4(从偏移量 40 或 42 开始的 4 个字节,具体取决于您是否有 44 字节标头或 46 字节标头)。 新值应该是一个十六进制数,表示新 wav 文件的总大小。即44/46 + size(data1) + size(data2)
如果您想合并或混合这两个文件(以便它们同时播放):
-
如果两个文件长度相同,则无需编辑标题。
从字节 44/46 开始,您必须将每个样本编辑为 data1 中的值 + data2 中的值。 例如,如果您的 SampleRate 是 8 位,您将修改 1 个字节,如果您的采样率是 16 位,您将修改 2 个字节。 文件的其余部分只是 1/2 字节的样本,存储一个表示当时声音波形的 int 值。
一个。对于文件中剩余的每个样本,获取 1/2 字节的十六进制字符串,并从文件 data1 和 data2 中获取 int 值。
b.将 1/2 字节整数相加 将结果转换回十六进制并在输出文件中使用该值。
c。您通常必须将该数字除以 2 以获得适合原始 1/2 字节样本块的平均值。当我在 objc 中尝试它时(可能与有符号或无符号整数有关)并且只是跳过了除法部分,我得到了失真,因为如果你将非常响亮的声音合并在一起,它只会成为一个问题。 即当 data1 + data2 大于 1/2 字节时,声音将被剪辑。有人讨论了剪辑问题here,您可能想尝试其中一种剪辑技术。
【讨论】:
嗨 Thamster,我想合并两个 wav 文件。我这样做了,但是在合并它们之后,我们可以在这里两首歌曲以及歌曲噪音也发生..请帮助我...int a =buffer_1 [一]/2; int b =buffer_2[i]/2;诠释 c = (a+b); datafinal[i]=(字节) c; 感谢您的解决方案。对于将来可能遇到这种情况的任何人,不除以 2 给我带来了扭曲。我正在为 16 位 PCM 文件单独添加每个字节。【参考方案2】:Merge 意味着混合,但听起来你在这里的意思是串联。
要与中间的静音连接,您需要在文件中插入许多静音帧。无声帧是每个通道都有一个“0”的帧 - 如果您使用有符号样本,这实际上是一个 0,对于无符号,它是 maxvalue/2。
每一帧的每个通道都有一个样本。因此,要以 CD 格式生成一秒钟的静音,您将插入 44100 (hz) * 2(每帧通道)= 88200 个 16 位有符号整数,每个整数值为 0。我不确定如何访问由 Java 音频抽象抽象出来的原始文件,但这是要插入的数据。
【讨论】:
以上是关于如何将两个 wav 文件合并/合并为一个 wav 文件?的主要内容,如果未能解决你的问题,请参考以下文章