Java 如何将两个wav文件合并成一个wav文件?

Java 如何将两个wav文件合并成一个wav文件?,java,audio,Java,Audio,如何使用java合并两个wav文件 我试过了,但没有成功,他们还有别的办法吗 Merge意味着混合,但听起来你这里指的是串联 将中间的沉默连接到文件中,需要插入多个沉默框。静默帧是指每个通道都有一个“0”-如果使用有符号采样,这实际上是一个0,对于无符号,它是maxvalue/2 每个帧将为每个通道提供一个样本。因此,要生成CD格式的1秒静默,需要插入44100(hz)*2(每帧通道)=88200个16位有符号整数,每个整数的值为0。我不知道如何访问由Java音频摘要提取的原始文件,但这就是要插

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


我试过了,但没有成功,他们还有别的办法吗

Merge意味着混合,但听起来你这里指的是串联

<>将中间的沉默连接到文件中,需要插入多个沉默框。静默帧是指每个通道都有一个“0”-如果使用有符号采样,这实际上是一个0,对于无符号,它是maxvalue/2


每个帧将为每个通道提供一个样本。因此,要生成CD格式的1秒静默,需要插入44100(hz)*2(每帧通道)=88200个16位有符号整数,每个整数的值为0。我不知道如何访问由Java音频摘要提取的原始文件,但这就是要插入的数据。

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

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

常用标头长度为44或46字节

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

  • 了解wav文件的格式
  • 切掉头44/46个字节作为头,文件的其余部分是数据
  • 创建一个新文件并在其中粘贴一个标题

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

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

    新的wav文件={header+data1+data2}={44/46+size(data1)+size(data2)}字节长

  • 在两个位置修改标题以反映新文件的长度

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

    b。修改字节40+4或42+4(从偏移量40或42开始的4个字节,取决于您的头是44字节还是46字节)。 新值应为十六进制数,表示新wav文件的总大小。ie{44/46+大小(数据1)+大小(数据2)}

  • 如果您希望合并或混合这两个文件(以便它们同时播放):

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

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

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

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


  • 它是如何工作不正常的?出什么问题了?结果文件太短了。您需要考虑的是,我试图合并的文件的每一个文件需要1秒甚至更少。也许这就是原因。那么每个文件的长度是1秒还是更短?那么歌曲的最大长度是2秒?我想我知道问题出在哪里了。如何在这两个文件之间添加1秒(或更长)的空音频?嗨,Thamster,我想合并两个wav文件。我这样做了,但合并后,我们可以在这里同时播放两首歌曲,也可以播放歌曲噪音。请帮助我…int a=buffer_1[I]/2;int b=缓冲区2[i]/2;int c=(a+b);datafinal[i]=(字节)c;谢谢你的解决方案。如果不除以2,我会对将来可能遇到这种情况的人产生扭曲。我为一个16位PCM文件分别添加每个字节。