1

我一直在创建一个 Java 项目,我希望一次播放多个声音,以及如何控制每个声音的音量和平移。我用谷歌搜索并阅读了 3 种不同的方法;问题是,我似乎找不到任何关于如何使用它们的教程或示例。他们是:

 import java.applet.AudioClip;
 import javax.sound.sampled;
 import sun.audio.SomethingOrOther; // Sorry, don't recall off-hand.  It was an "un-documented" site

当我继续阅读时,我发现 AudioClip 仅用于某种​​应用程序(“applet”?),而第三个仅在一百个站点中的一个上被提及。第二个是在这个网站上提出的,但它完全处理了一个不同的主题(关于“线条”的东西)。无论如何,我对 Java 语法已经足够熟悉,可以理解这个想法,但是我无法找到任何以直截了当的方式呈现的东西;因此,如果有人能指出我正确的方向,将不胜感激。

4

2 回答 2

2

Take a look at this trail in the Java tutorials: Trail: Sound, specifically Processing Audio with Controls

As suggested in Andrews comment you should look at FloatControl.Type (PAN for example).

于 2013-06-28T08:41:14.930 回答
0

在我看来,立体声混音的唯一真正选择是在帧(即每个样本)级别访问声音数据。用于平移和音量等的内置控件有点可疑,并且同时执行多个 SourceDataLine 甚至无法在某些操作系统(某些 Linux)上运行。

为此,有两种选择:编写自己的或使用库。

Java 教程“Trail:Sound”在“控件”教程的末尾轻轻提到了直接操作选项。他们给出的解释有助于弄清楚如何访问各个声音帧。如果你是第一次接触这些东西,学习这些东西是一项艰巨的工作(如果你使用的是 AudioClips,听起来你就是这样)。

我怀疑对您来说最好的选择是使用TinySound 之类的库。您可以在Java-Gaming.org上阅读有关它的更多信息。另一个要研究的库是JAudioLibs

我正在为游戏编码编写自己的立体声混音器,并且已经实现了控制音量和平移的粗略能力。在这样做的过程中,我发现 Java 并没有提供任何实时保证,只是它会尝试保持输出声音的连续性。诸如垃圾收集、线程切片、字节码与内存播放之类的事情,所有这些都违背了实时一致性。有关更多详细信息,请参阅本文:Java 中的实时、低延迟音频处理

从好的方面来说,Java 的核心实现(例如,AudioInputStream 和 SourceDataLine 之类的东西)非常强大,并且可以进行大量实时处理。但这需要一些仔细的编码。

于 2013-06-28T19:44:38.990 回答