在 Java 中混合声音?

Posted

技术标签:

【中文标题】在 Java 中混合声音?【英文标题】:Mixing Sound in Java? 【发布时间】:2009-04-09 05:59:13 【问题描述】:

如何在任何给定时间多次播放相同的声音而同时播放许多其他声音?现在我有一个“剪辑”播放,但它不会与自身重叠。 (我听到一颗子弹开火,声音结束然后再次播放)。我正在编写一个带有快速子弹发射系统的游戏,但我无法让声音正常工作。当您每秒在屏幕上生成 20+ 时,每半秒只听到一发子弹听起来并不“正确”。

有什么帮助吗?指针? :D

【问题讨论】:

【参考方案1】:

这似乎回答了你的问题:

http://my.safaribooksonline.com/9781598634761/ch09lev1sec3

引用:

“换句话说,单个 Clip 对象不能与自身混合,只能与其他声音混合。如果您使用较短的声音效果,此过程非常有效,但如果您的声音片段长度为 1 秒或更长,则听起来会很奇怪。 [...] 如果您想重复混合单个剪辑,有两个重要的选项(还有一个不太可能的选项): 1)将声音文件加载到多个Clip对象(如数组)中,然后依次播放。每当您需要播放此特定声音时,只需遍历数组并找到已播放完毕的剪辑,然后重新开始播放。”

所以原则上 Java 会进行混合,只是不在单个剪辑中。

【讨论】:

【参考方案2】:

一次播放 20 个 Bullit 剪辑可能会占用大量 CPU。可能没问题。我曾经做过一个风铃,它可以播放 7 个重叠的铃声(每个大约 3 或 4 秒长),然后将其设置为每 5 秒播放大约 100 个铃声。但程序没有做任何其他事情。

使用 Clips,要做到这一点,您需要制作多个副本,并且所有音频数据都将存放在那里,占用 RAM。如果他们真的很矮,那不是这样的牺牲。但是对于快速射击,大多数游戏使用的解决方案是切断声音并重新启动。您不必将声音播放到最后。

myClip.stop();
myClip.setFramePosition(0);
myClip.start();

随着每个 Bullit 的开始。这是最常做的事情。它使用的 CPU 和 RAM 比重叠 Clip 解决方案少得多。

【讨论】:

【参考方案3】:

AudioClip 可能是您要找的东西 - 我在播放短 .wav 音效的游戏中使用它,它并不完美,但大多数时候都能正常工作。

【讨论】:

使用 applet.AudioClip 会导致我的游戏偶尔卡顿。出于某种原因,它会打断我的游戏计时器。

以上是关于在 Java 中混合声音?的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中将最近混合的声音文件分成两个声音

在 Java 中,如何录制发送到扬声器的声音输出? [复制]

音量问题 - AVAudioPlayer 与 AudioServices 系统声音混合

Java中可靠的声音API,用于简单的数字样本播放

混合不同大小的声音文件

使用回调从 WCF 发送混合声音