【发布时间】:2018-07-12 15:36:56
【问题描述】:
对于点对点音频客户端,我需要能够将输出音量更改为所需的水平。在我的例子中,音量是一个介于 0 和 1 之间的浮点数。
我这样修改音频流:
void play(byte[] buf)
{
for (int i = 0; i < buf.length; i += 2)
{
// sample size is 2 bytes, so convert to int and then back
int data = ((buf[i + 1] & 0xFF) << 8) | (buf[i] & 0xFF);
data = (int) (data * outputVolume);
buf[i] = (byte) (data & 0xFF);
buf[i + 1] = (byte) (data >> 8);
}
line.write(buf, 0, Math.min(buf.length, line.available()));
}
现在,当 outputVolume 设置为 0 时,输出是静默的。当它设置为 1 时,它表现正常并且质量很好(因为它没有被修改)。但是 0 到 1 之间的任何数字都会产生比预期流本身更大的可怕噪音。在 0.5 时,噪音达到最大声点。
我不想使用混音器本身的控件(如增益控制或音量控制),因为我在这种方式中遇到了兼容性问题,后来,我想进一步修改字节流,所以我必须迭代无论如何都要通过流。
【问题讨论】:
-
outputVolume 的类型是什么?线的类型是什么?
-
@xtractic 我尝试了很多方法来移位数据,我的问题似乎是另一个
-
@AlexandreFenyo outputVolume 是
float。我的线路是SourceDataLine,采样率为 16kHz,小端序和每个采样 16 位 -
能否给出
byte[] buf = { 10, 11 }; play(buf); System.out.println(buf[0] + " ; " + buf[1]);的显示输出