我是使用javax.sound.sampled软件包的新手,我之所以选择使用该软件包,是因为我对使用的音频有了比一些更简单的声音解决方案(如AudioClip)更多的控制权。
我已阅读:Oracle's Sound Tutorial
(或者至少和我能掌握的一样多)但是我没有看到使用Line
界面调整Clip
上的播放水平/音量的方法,他们似乎给出了这些选项在包的部分允许您创建声音,但我无法通过我的Line
或我的AudioInputStream
找到任何方式进行这些调整。
我找到了带有文字的[this]页面,
另一方面,浮动控件非常适合表示连续变量控件,例如平移,平衡或音量。
但我的计算机上没有任何行返回任何控件(使用Line.getControls()
)
(我试图强制该行接受类似于this的FloatControl.Type.VOLUME
但我得到“不受支持的控件类型异常”)
是否可以通过Line的控件修改Line(使用Clip界面)上的音量/级别?或者是否可以修改AudioInputStream的音量?
或者有一种方法可以将控件添加到现有的线路中吗?
答案 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。