如何使用Java合并两个wav文件?
我尝试了这个方法,但它没有正确工作,还有其他的方法吗?
如果你直接使用wav文件的字节,那么你可以在任何编程语言中使用相同的策略。在这个例子中,我假设两个源文件具有相同的位率/通道数和相同的长度/大小(如果不是,你可以在开始合并之前对它们进行编辑)。
首先查看一下wav格式规范,我在斯坦福大学课程网站上找到了一个很好的规范。
常见的头文件长度为44或46字节。
如果你想连接两个文件(即在单个文件中播放一个wav,然后播放另一个wav):
创建一个新文件并将其中一个头部添加到该文件中。
new wav file = {header} = {44/46} bytes long
添加原始文件中的两个数据部分
new wav file = {header + data1 + data2 } = {44/46 + size(data1) + size(data2)} bytes long
修改头文件的两个位置以反映新文件的长度。
a. 修改第4+4个字节(即从偏移量4开始的4字节)。 新值应为十六进制数,表示新wav文件的大小为{44/46 + size(data1) + size(data2)}-8字节。
b. 修改第40+4或42+4个字节(从偏移量40或42开始的4个字节)。 新值应为十六进制数,表示新wav文件的总大小。即{44/46 + size(data1) + size(data2)}
如果你想合并或混合这两个文件(使它们同时播放):
从第44/46个字节开始,您需要编辑每个采样,使其值等于data1加上data2中的值。例如,如果您的采样率为8位,则需要修改1个字节;如果您的采样率为16位,则需要修改2个字节。 其余部分仅是存储在1/2字节中的int值,表示该时间声音的波形的采样。
a. 对于文件中剩余的每个采样,获取1/2字节十六进制字符串,并从data1和data2中获取int值。
b. 将1/2字节整数相加,将结果转换回十六进制,并在输出文件中使用该值。
c. 您通常需要将该数字除以2,以获得适合原始1/2字节采样块的平均值。当data1 + data2大于1/2字节时,声音会裁剪。关于裁剪问题,这里有一个讨论here,您可能想尝试其中一种裁剪技术。