用于音频处理的Java是否实用?

时间:2009-01-02 18:19:41

标签: java performance audio signal-processing real-time

Java是用于实时音频处理的C / C ++的合适替代品吗?

我正在考虑一个带有延迟线(30s @ 48khz),过滤(512点FIR?)以及同时在每个轨道上进行的其他DSP类型操作的~100(最大)音轨的应用程序。

操作将被转换并以浮点执行。

该系统可能是4GB RAM的四核3GHz,运行Ubuntu。

我见过关于Java的文章比过去快得多,接近C / C ++,现在也有实时扩展。这是现实吗?它是否需要硬核编码和调整才能达到C的%50-%100性能指标?

我真的在寻找一种感觉,如果这是可能的,并为任何陷阱提供支持。

9 个答案:

答案 0 :(得分:19)

对于音频应用程序,您通常只有非常小的代码部分,大部分时间都用在这部分代码上。

在Java中,您始终可以使用JNI(Java Native接口)并将计算繁重的代码移动到C模块(如果您确实需要电源,则使用SSE进行组装)。所以我会说使用Java并让你的代码正常工作。如果事实证明您不符合您的绩效目标,请使用JNI。

无论如何,90%的代码很可能是胶水代码和应用程​​序。但请记住,您通过这种方式放弃了一些跨平台功能。如果您能忍受JNI将永远为您打开本机代码性能的大门。

答案 1 :(得分:8)

Java适用于许多音频应用程序。与其他一些海报相反,我觉得Java音频很有用。将您可用的API和资源与CoreAudio中可怕的,几乎没有记录的mindf * k进行比较,您将成为一名信徒。 Java音频存在一些延迟问题,但对于许多应用程序而言,这是无关紧要的,并且缺乏编解码器。还有很多人从不打算花时间写出好的音频播放引擎(提示,永远不要关闭SourceDataLine,而是写零),然后责怪Java的问题。从API的角度来看,Java音频非常直观,易于使用,并且在jsresources.org有很多很多指导。

答案 2 :(得分:5)

当然,为什么不呢?

关键问题(独立于语言,这来自排队理论)是:

  • 您需要处理的最大吞吐量是多少(您指定的是100 x 48kHz,是单声道还是立体声,在该频率下等效多少位?)
  • 您的Java例程可以平均跟上这个速率吗?
  • 最大允许延迟是多少?

如果您的程序平均可以跟上吞吐量,并且您有足够的延迟空间,那么您应该能够使用队列进行输入和输出,并且程序中唯一对时序至关重要的部分是将数据放入输入队列并将其从输出队列中取出并将其发送到DAC /扬声器/其他任何内容的部分。

延迟线具有较低的计算负荷,您只需要足够的内存(+内存带宽)......实际上您应该只使用输入/输出队列,即开始立即将数据放入输入队列,然后启动稍后将数据从输出队列中取出30秒。如果它不在那里,你的程序太慢......)。

飞行情报区更昂贵,可能会成为瓶颈(以及你想要优化的东西),除非你考虑到其他一些令人讨厌的恶劣行动。

答案 3 :(得分:3)

我在你的问题中没有看到的一件事是你是否需要播放这些处理过的样本,或者你是否正在对它们做其他事情(例如将它们编码成文件)。我更担心Java的声音引擎的状态,而不是JVM可以快速处理样本的速度。

几年前我在javax.sound.sampled上非常努力,并且对此感到非常不满意 - 它与OpenAL或Mac / iPhone的Core Audio等相同的框架无法比较(两者都是我用过的相似程度的强度)。 javax.sound.sampled要求您将样本推送到未知持续时间的不透明缓冲区,这使得同步几乎不可能。它也很难记录(很难找到一个Line上的不确定长度音频流的例子,而不是内存中的Clips的简单例子),有未实现的方法(DataLine.getLevel()......其非实现不是'甚至记录在案,并且最重要的是,我相信Sun在几年前解雇了最后一位JavaSound工程师。

如果我 使用Java引擎进行混音和输出,我可能会尝试使用JOAL绑定到OpenAL作为首选,因为我至少知道引擎目前支持并具有非常低的延迟。虽然从长远来看我怀疑Nils是正确的,但你最终会使用JNI调用本机声音API。

答案 4 :(得分:3)

我认为延迟将是您的主要问题 - 在现代操作系统上很难维持C / C ++中的延迟,并且Java肯定会增加问题(垃圾收集器)。 “实时”音频处理的一般设计是让您的处理线程以实时调度运行(Linux内核上的SCHED_FIFO,相当于其他操作系统),并且这些线程永远不应该阻塞。这意味着没有系统调用,没有malloc,当然没有IO等等...甚至分页也是一个问题(从磁盘到内存的页面很容易需要几毫秒),所以你应该锁定一些页面,以确保它们永远不会换掉了。

你可能能够用Java做这些事情,但java使它变得更复杂,而不是更容易。我会研究一个混合设计,其中核心将在C中,其余的(GUI等等)将在java中。如果你愿意的话。

答案 5 :(得分:3)

是的,Java非常适合音频应用。您可以使用Java并通过Asio访问音频层,并且在Windows平台上具有非常低的延迟(64个样本延迟,几乎没有)。这意味着您将在视频/电影上进行唇形同步。 Mac上的延迟更多,因为没有Asio来“快捷”OS X和“Java on the top”的组合,但仍然可以。 Linux也,但我更无知。请参阅soundpimp.com,了解Java和Asio在完美和谐中的实用(以及世界首创)示例。另请参阅包含sw mp3解码器(来自Java)的NRK Radio& tv Android应用程序。您可以使用Java执行大多数音频事务,然后在额外时间关键时使用本机层。

答案 6 :(得分:2)

查看一个名为Jsyn的库。

http://www.softsynth.com/jsyn/

答案 7 :(得分:-1)

为什么不花一天的时间编写一个简单的Java应用程序来进行最少的处理并验证性能是否足够。

答案 8 :(得分:-3)

来自http://www.jsresources.org/faq_performance.html#java_slow

  

让我们收集一些以太智慧:

     
      
  • 地球是平坦的。

  •   
  • 并且,不要忘记:Java很慢。

  •   
     

正如一些应用程序证明的那样(参见链接部分),Java就足够了   构建音频编辑器,多轨录音系统和MIDI   处理软件。试试吧!