我希望在我的Java小程序中加载到javax.sound.sampled.Clips
数组中的两个音频剪辑之间平滑过渡。此刻我停止一个剪辑并开始下一个剪辑,但由于音频停止和突然启动,这会产生可听到的咔哒声。我需要使用Clip接口,这样我就可以在剪辑之间进行循环和转换,保持相同的音轨位置。
我尝试在停止一个剪辑之前关闭增益,然后在使用FloatControl.Type.MASTER_GAIN
开始下一个时再增加增益。如果我想快速改变增益,这需要刷新缓冲区,如果我试图过快地改变增益,我就会点击和口吃。另外,刷新缓冲区需要我停止并重新启动剪辑以恢复刷新的缓冲区(因此我不会在刷新的部分上向前跳跃),这会引入我试图摆脱的相同点击。
有没有人有快速(在200ms内)改变增益的经验,比如从0dB到-60dB。我想我可能不得不进入缓冲级别并开始直接操作这些位,但我不知道如何从Clip接口到达它。
有什么建议吗?
答案 0 :(得分: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
如果您最终使用这些类,您可能会在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,因为播放器是有线程的。但我会让你弄清楚那些,或者你可以在这里询问,我会告诉你我做了什么来解决它们。
希望这有助于某人!