20

Java 是否适合替代 C/C++ 进行实时音频处理?

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

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

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

我已经看到有关 Java 比以前快得多、接近 C / C++ 并且现在还具有实时扩展的文章。这是现实吗?是否需要硬核编码和调整才能达到 C 的 %50-%100 性能?

如果这是可能的,我真的在寻找一种感觉,并为任何问题提个醒。

4

9 回答 9

19

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

在 Java 中,您始终可以使用 JNI(Java Native 接口)并将计算量大的代码移动到 C 模块(如果您确实需要强大的功能,也可以使用 SSE 进行程序集)。所以我会说使用 Java 并让你的代码工作。如果事实证明您没有达到性能目标,请使用 JNI。

无论如何,90% 的代码很可能是胶水代码和应用程​​序的东西。但请记住,您会以这种方式失去一些跨平台功能。如果您可以接受该 JNI 将始终为您打开本地代码性能的大门。

于 2009-01-02T18:37:49.907 回答
10

Java 适用于许多音频应用程序。与其他一些海报相反,我发现使用 Java 音频是一种乐趣。将您可用的 API 和资源与 CoreAudio 的可怕的、几乎没有文档记录的 mindf*k 进行比较,您就会相信。Java 音频存在一些延迟问题,尽管对于许多应用程序来说这无关紧要,并且缺乏编解码器。还有很多人从来没有费心花时间编写好的音频播放引擎(提示,永远不要关闭 SourceDataLine,而是向其写入零),然后将问题归咎于 Java。从 API 的角度来看,Java 音频非常简单易用,并且在jsresources.org上有大量的指导。

于 2010-03-06T11:22:21.403 回答
5

当然,为什么不呢?

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

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

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

延迟线的计算负载低,你只需要足够的内存(+内存带宽)......事实上你可能应该只使用输入/输出队列,即立即开始将数据放入输入队列,然后开始取出数据30 秒后输出队列。如果它不存在,你的程序太慢了......)。

FIR 更昂贵,这可能会成为瓶颈(以及您想要优化的内容),除非您考虑到其他一些丑陋的讨厌操作。

于 2009-01-02T18:29:05.337 回答
4

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

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

于 2009-07-06T11:39:55.367 回答
3

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

几年前,我在 javax.sound.sampled 上非常努力地推动了它,并没有留下深刻的印象——它无法与 OpenAL 或 Mac/iPhone 的 Core Audio 等等效框架相比(我都在类似的水平上使用过它们)强度)。javax.sound.sampled 要求您将样本推送到持续时间未知的不透明缓冲区中,这使得同步几乎不可能。它的记录也很差(很难找到通过 Line 流式传输不确定长度音频的示例,而不是内存中剪辑的琐碎示例),具有未实现的方法(DataLine.getLevel() ...甚至没有记录),最重要的是,我相信 Sun 在几年前解雇了最后一位 JavaSound 工程师。

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

于 2009-07-06T11:29:39.817 回答
3

是的,Java 非常适合音频应用程序。您可以使用 Java 并通过 Asio 访问音频层,并且在 Windows 平台上具有非常低的延迟(64 个样本延迟几乎没有)。这意味着您将在视频/电影上进行口型同步。Mac 上的延迟时间更长,因为没有 Asio 可以“捷径”将 OS X 和“Java 在顶部”的组合,但仍然可以。linux也有,不过我比较无知。有关 Java 和 Asio 完美协调工作的实用(也是世界首创)示例,请参阅 soundpimp.com。另请参阅包含 sw mp3 解码器(来自 Java)的 NRK Radio&tv Android 应用程序。您可以使用 Java 完成大多数音频操作,然后在时间紧迫的情况下使用本机层。

于 2011-11-15T21:18:07.597 回答
2

查看一个名为 Jsyn 的库。

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

于 2009-11-24T17:09:13.467 回答
-1

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

于 2009-09-06T02:30:50.943 回答
-2

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

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

  • 地球是平的。

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

正如几个应用程序所证明的(参见链接部分),Java 足以构建音频编辑器、多轨录音系统和 MIDI 处理软件。试试看!

于 2017-01-09T18:48:50.763 回答