如何将两个wav文件合并/合并到一个wav文件中?

时间:2010-04-05 14:28:24

标签: java audio

如何使用java合并两个wav文件?

我尝试了this,但它无法正常工作,是否有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:12)

如果直接使用wav文件的字节,则可以在任何编程语言中使用相同的策略。对于这个例子,我假设两个源文件具有相同的比特率/ numchannels并且长度/大小相同。 (如果没有,你可以在开始合并之前编辑它们。)

首先查看wav规范,我在stanford课程网站上找到了一个好的:

公共标头长度为44或46个字节。

如果你想连接两个文件(即在一个文件中播放一个wav,然后播放另一个文件):

  1. 找出您的wav文件的格式
  2. 砍掉作为标题的第一个44/46字节,文件的其余部分是数据
  3. 创建一个新文件并在其中粘贴其中一个标题。

    新的wav文件= {header} = {44/46}个字节长

  4. 从原始文件中添加两个数据部分

    新的wav文件= {header + data1 + data2} = {44/46 + size(data1)+ size(data2)} bytes long

  5. 在两个地方修改标题以反映新文件的长度。

    一个。修改字节4 + 4(即从偏移量4开始的4个字节)。 新值应为十六进制数,表示新wav文件的大小,以字节为单位{44/46 + size(data1)+ size(data2)} - 8bytes。

    湾修改字节40 + 4或42 + 4(从偏移40或42开始的4个字节,具体取决于您是否具有44字节标头或46字节标头)。 新值应为十六进制数,表示新wav文件的总大小。即{44/46 +尺寸(数据1)+尺寸(数据2)}

  6. 如果您想要合并或混合两个文件(以便它们同时播放):

    1. 如果两个文件的长度相同,则无需编辑标题。
    2. 从字节44/46开始,您必须将每个样本编辑为data1中的值+ data2中的值。 因此,例如,如果您的SampleRate是8位,您将修改1个字节,如果您的采样率是16位,您将修改2个字节。 文件的其余部分只是1/2个样本的样本,存储一个int值,表示当时声音的波形。

      一个。对于文件中的每个剩余样本,抓取1/2字节十六进制字符串,并从data1和data2两个文件中获取int值。

      湾将1/2字节整数加在一起 将结果转换回十六进制,并在输出文件中使用该值。

      ℃。您通常必须将该数字除以2才能获得适合原始1 / 2byte样本块的平均值。当我在objc中尝试它时可能会失真(可能与有符号或无符号的整数相关)并且只是跳过了除法部分,因为如果你将非常大的声音合并在一起它只会是一个问题。 即当data1 + data2大于1/2字节时,声音将被剪辑。有关剪辑问题here的讨论,你可能想尝试其中一种裁剪技术。

答案 1 :(得分:2)

合并意味着混合,但听起来你的意思是连接。

要在中间与静音连接,您需要在文件中插入一些静音帧。静音帧是每个通道都有一个“0”的帧 - 如果你使用带符号的样本,那么字面上是0,对于无符号,它是maxvalue / 2.

每个帧每个通道都有一个样本。因此,要以CD格式生成一秒静音,您将插入44100(hz)* 2(每帧通道)= 88200 16位有符号整数,每个值为0。我不确定如何访问Java音频抽象抽象的原始文件,但这是要插入的数据。