Java可以处理多少个音频剪辑?

时间:2013-05-16 15:51:23

标签: java audio javasound clip mixer

我正在用Java制作游戏。我希望有大约100个不同的样本,并且在任何给定的时间,可以播放10个样本。但是,对于这10个样本中的每一个,我希望能够操纵它们的音量和平移。

截至目前,我按如下方式请求一行:new DataLine.Info(Clip.class, format);

我没有指定此行所需的控件,但似乎剪辑始终具有MASTER_GAINBALANCE控件。

  1. 这是对的吗?
  2. 我可以创建一个包含100个剪辑的数组并预加载所有样本吗?我不太明白Java的线路是否与物理线路相对应是物理混频器还是虚拟化。
  3. 如果我受限制,那我怎样才能将样品换入和换出线?有没有办法做到这一点,以便所有我说的100个样本都预先加载?或者,预加载仅在您指定了一行时才有用吗?
  4. 同样,如果我受限制,这是错误的做法吗?我应该: 一个。使用不同的编程语言和/或 湾手动组合音频流并将它们全部放在同一行。
  5. 哇,这是很多问题。我没有在文档中找到答案,我真的希望你们能提供帮助。请将您的答案编号为1到4.非常感谢!

1 个答案:

答案 0 :(得分:1)

1)我认为假设总是有平衡甚至是MASTER_GAIN是不安全的。也许有。我对Java控件的音频体验很烦人,也很简短。我很快决定编写自己的调音台,并且已经这样做了。我愿意分享这段代码。它包括处理音量和平移的基本规定。

即使它们正常工作,Java控件的粒度也会受到所使用的缓冲区大小的限制,如果您尝试淡入淡出,这会严重限制淡入或淡出而不创建点击的速度。但是,设置和保持单个卷不是问题。

另一个java库(只有几个游戏程序员在java-gaming.org上进行审查)是" TinySound"这可以通过github获得。我已经看过了,但我自己没有用过它。它还将所有声音混合到单个输出SourceDataLine。我无法回想起如何处理音量或声像。他包含了ogg / vorbis文件的规定。

2)当你提及"样本"时,我不确定你是如何设想使用剪辑工作的。是的,您可以预加载100个剪辑的数组。你可以在它自己的线程上直接播放这些Clips中的一个或另一个(假设使用原始Java而不是音频混合库),然后将它们重置回第0帧,然后再次播放它们。但是你一次只能有一个线程播放一个给定的Clip:它们不适合并发播放。 (你可以"重新触发"但是通过停止给定的播放并将位置移回帧#0然后重播。)

剪辑有多长?其中100个可能是很多记忆。如果每个都是第二个长,100秒* 44100帧/秒*每帧4个字节= 17,640,000个字节(几乎18MB专用于RAM用于声音!)。

我想,如果你知道你一次只需要几个并且你可以预测需要哪些,你可以预先加载它们并重复使用它们。但是,不要陷入认为剪辑意味着在播放时被加载的陷阱。如果您这样做,则应使用SourceDataLines。他们开始快速播放,因为他们不必等到整个外部文件被放入内存(如剪辑所做的那样)。如果您打算将其重置为第0帧并重播(或循环播放),我建议仅使用Clip!

3)一旦它作为一个Clip加载,它基本上就准备好了,真的没有一个额外的阶段。外部文件和内存中的Clip之间确实没有任何中间阶段,我认为这可能会有所帮助。

啊,另一个想法:你可能想要创建一个线程池(=最大并发声音数)并管理它。我不知道缩放在什么时候证明额外的管理是合理的。

4)可以在许多上下文中运行并发SourceDataLines,这样就无需将整个文件保存在RAM中。在这种情况下,我认为唯一可以预加载的是文件位置的字符串。我可能错了,你也可以预装文件,但也许不是。绝对不能重用AudioInputLine!从好的方面来说,与UNLOADED Clip相比,SDL开始非常快。

无论其!有些系统(例如某些Linux OS)将您限制为单个输出,可能是Clip或SourceDataLine。当我决定建造自己的调音台时,这就是我的难关。

我认为如果一次只播放8或10个音调,只要图形不是太雄心勃勃(不计算上面提到的Linux操作系统情况),你可能会没问题。你必须测试它。

我不知道您正在考虑哪种替代语言。 C的一些味道是我所知道的唯一选择。除了Java之外,我所知道的大多数其他内容都不是低级或足够快以处理那么多的音频处理。但我只是经验丰富,没有良好的工程背景,但我是自学成才。