Java:快速淡入和淡出 javax.sound.sampled.Clip 的增益
我希望在加载到 Java 小程序中的 javax.sound.sampled.Clips 数组中的两个音频剪辑之间平滑过渡。目前,我停止一个剪辑并开始下一个剪辑,但由于音频突然停止和启动,这会产生可听见的咔嗒声。我需要使用剪辑界面,以便可以在剪辑之间进行循环和过渡,并保持相同的轨道位置。
我尝试在停止一个剪辑之前调低增益,然后在开始下一个剪辑时使用FloatControl.Type.MASTER_GAIN
将增益调高。如果我想快速改变增益,这需要刷新缓冲区,即使如此,如果我试图太快地改变增益,我也会卡顿和卡顿。另外,刷新缓冲区需要我停止并重新启动剪辑以取回已刷新的缓冲区(因此我不会向前跳过刷新的部分),这会引入我试图摆脱的相同点击声。
有谁有过快速改变增益(200 毫秒内)的经验,比如从 0dB 到 -60dB。我想我可能必须深入到缓冲区级别并开始直接操作这些位,但我不知道如何从剪辑界面实现这一点。
有什么建议吗?
I want to smoothly transition between two audio clips that are loaded into an array of javax.sound.sampled.Clips
in my Java applet. At the moment I stop one clip and start the next but this produces audible clicking noises due to the audio stopping and starting abruptly. I need to use the Clip interface so that I can do looping and transition between clips keeping the same track position.
I have tried turning the gain down before stopping one clip and then ramping the gain back up when I start the next using the FloatControl.Type.MASTER_GAIN
. This requires flushing the buffer if I want to change the gain quickly and even then I get clicking and stuttering if I try to change the gain too quickly. Plus flushing the buffer requires that I stop and restart the clip to get back the buffer that was flushed (so I don't jump forward over the flushed portion) and this introduces the same clicking that I am trying to get rid of.
Does anyone have experience changing gain quickly (within 200ms), say from 0dB to -60dB. I'm thinking I may have to get down to the buffer level and start manipulating the bits directly but I don't know how to get to this from the Clip interface.
Any suggestions?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
发现了 Clip 类的一个很棒的扩展,它允许您创建具有多个流的单个 Clip 对象,然后使用自定义过渡(例如淡入和淡出)在流之间切换。这消除了烦人的点击声!
我在 HydrogenAudio 论坛上找到了它,作者是一位名叫 googlebot 的很棒的人。它是在 GNU 许可证下开源的。
以下是论坛帖子的链接,描述了创建该课程的计划:
Hydrogenaudio.org/forums/index.php?showtopic=80673(垃圾邮件机器人说我只能发布一个链接:P)
这是一个指向 Google 代码页的链接,您可以在其中获取 Java 类文件:
http://code .google.com/p/advancedabx/source/browse/#hg/AdvancedABX/src/de/uebber/sound/lib
如果您最终使用这些类,您可能会在 open 和 addstream 中发现一些数组边界错误SwitchableArrayClip.java 类中的函数。
您需要将: 更改
为:
由于播放器是线程化的,因此还有一些其他问题,例如使用 setFramePosition。但我会让你弄清楚这些问题,或者你可以在这里提问,我会向你展示我是如何解决这些问题的。
希望这对某人有帮助!
Found an awesome extension to the Clip class that lets you create a single Clip object with multiple streams and then use custom transitions, such as fade in and out, to switch between streams. This gets rid of the annoying clicking!
I found it on the HydrogenAudio forums, written by an awesome guy who goes by the handle googlebot. It's open source under the GNU licence.
Here's a link to the forum posts describing the program the class was created for:
hydrogenaudio.org/forums/index.php?showtopic=80673 (spam bot says I can only post one link :P)
Here's a link to the Google code page where you can grab the Java class files:
http://code.google.com/p/advancedabx/source/browse/#hg/AdvancedABX/src/de/uebber/sound/lib
If you end up using these classes you might find some array bounding errors in the open and addstream functions in the SwitchableArrayClip.java class.
You will need to change:
to:
There are some other issues, such as using setFramePosition, due to the fact that the player is threaded. But I will let you figure those out or you can ask here and I will show you what I did to fix them.
Hope this helps someone!