如何将两个WAV文件合并/合并为一个WAV文件?

如何使用Java合并两个WAV文件?

我试过了,但是没有正常工作,他们还有其他方法吗?

回答:

如果直接使用wav文件的字节,则可以在任何编程语言中使用相同的策略。对于此示例,我将假设两个源文件具有相同的比特率/数字通道,并且具有相同的长度/大小。(否则,您可能可以在开始合并之前对其进行编辑)。

首先看一下WAV规范,我在斯坦福课程网站上找到了一个很好的人:

常见的标头长度为44或46个字节。

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

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

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

  1. 添加原始文件中的两个数据部分

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

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

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

size(data2)}-8个字节为单位。

b。修改字节40 + 4或42 +

4(从偏移40或42开始的4个字节,取决于您是否具有44字节头或46字节头)。新值应为代表新wav文件总大小的十六进制数。即{44/46 +

size(data1)+ size(data2)}

如果要合并或混合这两个文件(以便它们同时播放),请执行以下操作:

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

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

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

C。通常,您必须将该数字除以2才能获得适合原始1/2字节样本块的平均值。当我在objc中尝试时可能会失真(可能与有符号或无符号int相关),只是跳过了除法部分,因为如果您将很大的声音合并在一起,则可能会出现问题。即,当data1

+data2大于1/2字节时,声音将被裁剪。与会者一致认为,剪裁问题进行讨论,[在这里iPhone将音频作为16位整数处理。大多数音频文件已经标准化,因此峰值采样值是适合16位带符号整数的最大值。这意味着,如果将两个这样的样本加在一起,则会溢出,或者在这种情况下会发生音频剪辑。如果要将两个音频源混合在一起并确保没有削波,则必须对样本求平均:将它们加在一起并除以二。或者您将音量设置为一半。如果您使用的是分贝,则变化约为-6 dB。),你可能想尝试的那些剪裁技术之一。

以上是 如何将两个WAV文件合并/合并为一个WAV文件? 的全部内容, 来源链接: utcz.com/qa/428865.html

回到顶部