Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java可以处理多少个音频片段?_Java_Audio_Javasound_Clip_Mixer - Fatal编程技术网

Java可以处理多少个音频片段?

Java可以处理多少个音频片段?,java,audio,javasound,clip,mixer,Java,Audio,Javasound,Clip,Mixer,我正在用Java做一个游戏。我想有大约100个不同的样本,在任何给定的时间,10个样本可以发挥。然而,对于这10个样本中的每一个,我希望能够操纵它们的体积和平移 现在,我请求如下一行:newdataline.Info(Clip.class,format) 我没有为此行指定所需的控件,但剪辑似乎始终具有MASTER_GAIN和BALANCE控件 这是正确的吗 我可以创建一个包含100个剪辑的数组并预加载所有样本吗?我不太明白Java的行是与物理混频器中的物理行相对应,还是虚拟化了 如果我受到限制,

我正在用Java做一个游戏。我想有大约100个不同的样本,在任何给定的时间,10个样本可以发挥。然而,对于这10个样本中的每一个,我希望能够操纵它们的体积和平移

现在,我请求如下一行:
newdataline.Info(Clip.class,format)

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

  • 这是正确的吗
  • 我可以创建一个包含100个剪辑的数组并预加载所有样本吗?我不太明白Java的行是与物理混频器中的物理行相对应,还是虚拟化了
  • 如果我受到限制,那么我如何交换行内和行外的样本?有没有办法做到这一点,使我说的所有100个样品都预加载?或者,预加载是否仅在您已经指定了行时才有帮助
  • 再说一次,如果我受到限制,这是错误的方法吗?我应该: A.使用不同的编程语言,和/或 B手动组合音频流并将它们全部放在同一行中
  • 哇,问题真多。我在文档中没有找到答案,我真的希望你们能帮助我。请把你的答案编号为1到4。多谢各位

    1)我认为,假设总是会有一个平衡点,甚至是一个主收益,是不安全的。也许有。我使用Java音频控件的经验既烦人又短暂。我很快决定写我自己的混音器,并且已经这样做了。我愿意分享这段代码。它包括处理体积和平移的基本规定

    即使在工作时,Java控件的粒度也受到所使用的缓冲区大小的限制,这严重限制了在尝试淡入淡出时,在不创建单击的情况下淡入淡出的速度。不过,设置和保存单个卷并没有问题

    另一个java库是“TinySound”,它是通过github提供的(基本上是由java gaming.org上的几个游戏程序员审查的)。我已经看过了,但我自己没用过。它还将所有声音混合到单个输出源数据线。我记不起音量或平移是如何处理的。他包括ogg/vorbis文件的规定

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

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

    我想,如果你知道你一次只需要几个,并且你可以预测哪些是需要的,你可以预加载它们并重用它们。但不要陷入这样的陷阱:认为剪辑是在播放时加载的。如果您正在这样做,那么应该改用SourceDataLines。它们开始播放得更快,因为它们不必等待整个外部文件被放入内存(就像剪辑一样)。如果您计划将剪辑重置为第0帧并重播(或循环播放),我建议您仅使用剪辑

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

    啊,另一个想法是:您可能想要创建一个线程池(=并发声音的最大数量)并管理它。我不知道在哪一点上,这种扩展证明了额外管理的合理性

    4) 可以在许多上下文中运行并发SourceDataLines,这样就不需要将整个文件保存在RAM中。在这种情况下,我认为唯一可以预加载的是文件位置的字符串。我可能错了,你也可以预加载文件,但可能不行。绝对不能重复使用音频输入线!从好的方面来看,SDL比未加载的剪辑启动得更快

    然而!有些系统(例如,一些Linux操作系统)将您限制为单个输出,可能是Clip或SourceDataLine。这是我决定建造自己的搅拌机时的关键

    我认为,如果一次只播放8或10个音调,那么只要图形不太理想(不包括上面提到的Linux操作系统情况),您可能就可以了。你得测试一下


    我不知道你在考虑什么样的替代语言。我所知道的唯一的选择就是C的味道。除Java之外,我所知道的大多数其他东西都不够低或快,无法处理这么多的音频处理。但我只是经验丰富,没有良好的工程背景,但我是自学的。< / P>请把你的答案1到4。“请考虑问4个问题(4个单独的线程)”“java可以处理多少个音频剪辑?”我的经验表明没有硬性的规则-这取决于JRE。非常感谢!事情进展顺利,这是非常有益的D