是Java一个合适的替代C/C++进行实时声频处理?

我正在考虑一个程序与~100(在最)轨道的音频带的延迟线(30@48khz)、筛选(512点杉?), 和其他DSP类型的操作发生在每个轨道上同时进行。

该行动将转变和进行的浮点。

该系统可能会是一个四核3GHz与4G RAM、运行Ubuntu。

我已经看到有关的文章Java正在速度远远超过它过去是,越来越靠近C/C++、并且现在具有实时扩展。这是现实?它需要努力的核心编码和调整,以实现%的50%100性C些规范的清?

我真的想找一个有意义,如果这是可能的,抬头的任何陷阱。

有帮助吗?

解决方案

对于一个音频程序,你常常只有非常小的部分的码在那里的大部分时间花费。

在爪哇,你总是可以使用的JNI(Java地接口)和移动计算沉重的代码成一个C-模块(或大会使用证如果你真的需要功率)。所以我想说的使用和得到代码的工作。如果事实证明,你不能满足您的业绩目标使用JNI.

90%的代码很可能将被胶水码和应用程序东西呢。但是记住,你松一些的跨平台功能的方式。如果你可以住在一起,JNI将永远离开你的门打开机代码的业绩。

其他提示

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

当然,为什么不呢?

关键的问题(独立的语言,这是从排队论)是:

  • 什么是最大的吞吐量需要处理(指定了100x48kHz,是单或立体声,有多少位相当于在那个频率?)
  • 可你Java程序跟上这个比率的平均?
  • 什么是允许的最大延迟?

如果你的节目可以跟上的吞吐量平均值,并有足够的空间,为等待时间,然后你应该能够利用排队的输入和输出,并且只有部分程序是关键时是件,把数据输入队列并把它输出的队列,并发送到DAC/扬声器/无论。

延迟线有低计算负荷,你只需要足够的存储器(+存储器的带宽)...事实上你也许应该只是使用的输入/输出的队列,即开始把数据输入队列,并立即开始把数据输出的队列中的30岁以后。如果它不在那里,你的程序太慢...).

第一是更昂贵,这就是可能的瓶颈(&什么你想要优化)除非你有其他一些丑恶心的操作中心。

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

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

我在你的问题中没有看到的一件事是你是否需要播放这些处理过的样本,或者你是否正在对它们做其他事情(例如将它们编码成文件)。我更担心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。

是的,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执行大多数音频事务,然后在额外时间关键时使用本机层。

查看一个名为Jsyn的库。

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

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

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

让我们收集的一些ethernal智慧:

  • 地球是平的。

  • 而且,不要忘记:Java是缓慢的。

作为几个应用程序证明(见链接部分)、Java是足够的 建立音频编辑、多轨记录系统和MIDI 处理软件。试试吧!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top