如何在不使用控件的情况下调整Line的音量

时间:2011-12-25 04:01:48

标签: java line volume audio

我是使用javax.sound.sampled软件包的新手,我之所以选择使用该软件包,是因为我对使用的音频有了比一些更简单的声音解决方案(如AudioClip)更多的控制权。

我已阅读:Oracle's Sound Tutorial (或者至少和我能掌握的一样多)但是我没有看到使用Line界面调整Clip上的播放水平/音量的方法,他们似乎给出了这些选项在包的部分允许您创建声音,但我无法通过我的Line或我的AudioInputStream找到任何方式进行这些调整。

我找到了带有文字的[this]页面,

  另一方面,浮动控件非常适合表示连续变量控件,例如平移,平衡或音量。

但我的计算机上没有任何行返回任何控件(使用Line.getControls()

(我试图强制该行接受类似于thisFloatControl.Type.VOLUME但我得到“不受支持的控件类型异常”)

是否可以通过Line的控件修改Line(使用Clip界面)上的音量/级别?或者是否可以修改AudioInputStream的音量?

或者有一种方法可以将控件添加到现有的线路中吗?

2 个答案:

答案 0 :(得分:1)

使用FloatControl.Type.MASTER_GAIN而不是使用FloatControl.Type.VOLUME。

答案 1 :(得分:0)

除了使用线条之外,还有至少一种其他方式。 (我也很难找到一条控制线,并发现一条Master系列工作,按照Travis Meyers的建议。我给他+投票。)不确定你是否想去那里,但它有可能成倍增加每个帧的音频值按体积因子。 Java Tutorial对这种技术进行了传递引用,但与该文档中的其他内容一样,它们没有提供明确的示例。

因此,当您获取字节缓冲区时,必须循环缓冲区,组合字节以获取音频值。然后,乘以你的音量因子(通常是从0到1.0的浮点数),然后将音频值反汇编回字节。

有效。我是用粗略的Java Theremin来做的,你可以尝试一下。我还在该程序中以每帧为基础操纵我的音高。但该计划仍存在问题!我现在正在努力改进将GUI事件数据传输到音频循环的方式。此外,我正在响应每帧的更改,而不是基于每个缓冲区。但对于大多数用途,每缓冲区都很好。

那就是说,要注意的是要注意发送导致不连续的音量变化,这会导致大声咔嗒声。导致点击的数量可能在不同的音量范围内有所不同。此外,音量不会以线性方式完全下降,因为您的音量因子从0到1.0。