Java:快速淡入淡出 javax.sound.sampled.Clip 的增益
Posted
技术标签:
【中文标题】Java:快速淡入淡出 javax.sound.sampled.Clip 的增益【英文标题】:Java: Quickly fade in and out the gain of a javax.sound.sampled.Clip 【发布时间】:2010-08-26 01:23:34 【问题描述】:我想在我的 Java 小程序中加载到 javax.sound.sampled.Clips
数组中的两个音频剪辑之间平滑过渡。目前我停止一个剪辑并开始下一个剪辑,但由于音频突然停止和开始,这会产生可听见的咔嗒声。我需要使用 Clip 界面,以便在保持相同轨道位置的剪辑之间进行循环和过渡。
我尝试在停止一个剪辑之前降低增益,然后在使用FloatControl.Type.MASTER_GAIN
开始下一个剪辑时将增益回升。如果我想快速改变增益,这需要刷新缓冲区,即使如此,如果我试图太快地改变增益,我也会点击和结结巴巴。另外,刷新缓冲区需要我停止并重新启动剪辑以取回已刷新的缓冲区(因此我不会向前跳过已刷新的部分),这会引入与我试图摆脱的相同的点击。
有没有人经历过快速改变增益(在 200 毫秒内),比如从 0dB 到 -60dB。我在想我可能不得不降低到缓冲区级别并开始直接操作这些位,但我不知道如何从 Clip 界面进行操作。
有什么建议吗?
【问题讨论】:
【参考方案1】:找到了 Clip 类的一个很棒的扩展,它允许您创建一个具有多个流的 Clip 对象,然后使用自定义转换(例如淡入和淡出)在流之间切换。这样就摆脱了烦人的点击!
我在 HydrogenAudio 论坛上找到了它,作者是一个很棒的家伙,他的名字是 googlebot。它是在 GNU 许可下开源的。
这是一个论坛帖子的链接,该帖子描述了创建该类的程序: hydroaudio.org/forums/index.php?showtopic=80673(垃圾邮件机器人说我只能发布一个链接:P)
这是一个指向 Google 代码页的链接,您可以在其中获取 Java 类文件: http://code.google.com/p/advancedabx/source/browse/#hg/AdvancedABX/src/de/uebber/sound/lib
如果您最终使用这些类,您可能会在 SwitchableArrayClip.java 类的 open 和 addstream 函数中发现一些数组边界错误。
你需要改变:
// Fill it
int numRead = 0;
int offset = 0;
while (numRead != -1)
numRead = stream.read(audioData[0], offset - numRead, len - numRead);
到:
// Fill it
int numRead = 0;
int offset = 0;
while (numRead != -1)
numRead = stream.read(audioData[0], offset, len - offset);
offset += numRead;
由于播放器是线程化的,还有一些其他问题,例如使用 setFramePosition。但我会让你弄清楚这些,或者你可以在这里问,我会告诉你我做了什么来解决它们。
希望这对某人有所帮助!
【讨论】:
以上是关于Java:快速淡入淡出 javax.sound.sampled.Clip 的增益的主要内容,如果未能解决你的问题,请参考以下文章