gpt4 book ai didi

java - 如何将两个 wav 文件组合/合并为一个 wav 文件?

转载 作者:搜寻专家 更新时间:2023-11-01 04:07:04 25 4
gpt4 key购买 nike

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

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

最佳答案

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

首先查看 wav 规范,我在 stanford 找到了一个很好的规范类(class)网站:

常见的 header 长度为 44 或 46 字节。

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

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

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

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

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

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

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

    修改字节 40+4 或 42+4(从偏移量 40 或 42 开始的 4 个字节,具体取决于您有 44 字节的 header 还是 46 字节的 header )。新值应该是一个十六进制数,表示新 wav 文件的总大小。即{44/46 + 大小(data1) + 大小(data2)}

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

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

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

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

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

关于java - 如何将两个 wav 文件组合/合并为一个 wav 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2578862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com