寻找控制音量和平移的方法

时间:2013-06-28 08:35:04

标签: java audio javasound audio-panning

我一直在创建一个Java项目,我希望一次播放多个声音,以及如何控制每个声音的音量和平移。我用Google搜索并阅读了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语法已经足够熟悉了,但是我还没有找到任何直接呈现的东西;所以,如果有人能指出我正确的方向,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

在Java教程中查看此跟踪:Trail: Sound,特别是Processing Audio with Controls

正如安德鲁斯评论中所建议的,你应该看看FloatControl.Type(例如PAN)。

答案 1 :(得分:0)

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

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

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

我怀疑你最好的选择是使用像TinySound这样的库。您可以在Java-Gaming.org了解更多相关信息。另一个要调查的图书馆是JAudioLibs

我正在为游戏编码编写自己的立体声混音器,并且已经实现了粗略且准备好的能力来控制音量和平移。在这样做的过程中,我发现Java不会提供任何实时保证,除了它会尝试保持输出声音连续。垃圾收集,线程切片,字节码与内存播放等所有这些都与实时一致性有关。有关更多详细信息,请参阅此文章:REAL-TIME, LOW LATENCY AUDIO PROCESSING IN JAVA

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