【问题标题】:Joining two (or more) byte[] of wav-sound. Gives backgroundnoise加入两个(或更多)字节 [] 的 wav 声音。产生背景噪音
【发布时间】:2017-04-08 02:54:55
【问题描述】:

我正在尝试加入 wav-sound 的字节数组,它除了背景噪声外都可以工作。任何人都知道添加两个声音字节数组的任何算法。

这是我迄今为止尝试过的

for(int i=0;i<bArr1.length;i++)
{
   bArrJoined[i]=bArr1[i] + bArr2[i];
}

还试图除以 2 以得到高数

for(int i=0;i<bArr1.length;i++)
{
   bArrJoined[i]=(bArr1[i] + bArr2[i]) / 2;
}

有人知道如何在没有噪音的情况下完成这项工作吗?

【问题讨论】:

标签: java audio wav


【解决方案1】:

这里有很多事情可能会导致伪影。不同的音频采样率或数据位大小可以做到这一点。

假设这些都不是问题,你应该知道你不能在没有溢出的情况下添加一个 byte 和另一个 byte(256 将变为 0,等等)。所以在添加之前转换为int。如果您超过最大音量,则会发生削波,因此您的除以 2 操作很聪明,应该会停止该问题。除法操作应在int 版本中进行。最后只转换回byte

但是,如果您不使用 8 位音频,那么 byte 不是您的基本单位。例如,16 位音频使用 2 个字节,在对这些值执行任何数学运算之前,您需要将每两个连续的 bytes 转换为 int(相对于正确的字节序)。对于每个单个数值,32 位音频数据占用 4 个连续字节。仅仅拥有一个字节数组本身并不能告诉您数据边界在哪里。

【讨论】:

  • 嗨。感谢您的回答。它是相同原始声音的音频剪辑,因此采样率等和位大小相同,我只尝试了 8 位中的 1 个字节。这可能是问题所在,我现在有一些想法可以解决。我考虑过的一件小事是,例如一个值是 3,下一个是 4=7,除以 int 的 7 只是整数,因此波不再是确切的波。很小的变化,但也许会影响音质?
  • 如今 8 位音频很少见,所以如果您不确定音频的位大小(它包含在 .wav 文件头信息或 .mp3 头中),我敢肯定这是您的问题如果您将 MP3 流解码为 WAVE 数据)。您所指的整数除法截断仅在 8 位音频中是一个问题。因为它只有 255 个离散值步骤,所以有眼光的耳朵可能会注意到这一点。但是对于 16 位或更高的音频,人耳无法区分 1 个离散值步长(16 位总共 65,535 个离散步长)。
  • 是的。我用错了位。我通过将每个字节的整数相加而不是制作 16 位整数,使整数看起来像是 8 位声音。谢谢
猜你喜欢
  • 2021-05-13
  • 2015-09-16
  • 2018-10-17
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多