首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android上的线程化低延迟音频

Android上的线程化低延迟音频
EN

Stack Overflow用户
提问于 2013-06-07 23:21:05
回答 1查看 1.1K关注 0票数 3

简而言之:我正在开发一个synth应用程序,并使用低延迟的Opensl。我在Opensl回调函数中做了所有的音频计算(我知道我不应该做,但我还是做了)。现在计算在我的nexus4上占用了大约75%的cpu时间,所以下一步是在多线程中进行所有的计算。

我遇到的问题是音频开始卡顿,因为回调线程显然运行在高优先级上,而我的新线程没有。如果我使用更多/更大的缓冲区,问题就会消失,但实时也会消失。在新线程上设置更高的优先级似乎不起作用。那么,有没有可能做线程化的低延迟音频,或者我必须在回调中做所有的事情才能让它工作?

我有一个256个样本的缓冲区,大约是5ms,这应该是线程调度程序运行我的calc线程的时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-08 00:53:52

我认为根本的问题在于你的合成引擎的性能。一个像样的通道计数与Cortex-A8或-A9中央处理器是可以实现的一个单一的核心。你是用什么语言实现的?如果恰好是Java,我建议将其移植到C++。

使用多线程进行合成当然是可能的,但也带来了新的问题--即每个线程必须同步,然后才能混合生成的音频。

除非异步运行合成线程会产生额外的延迟,否则可能的设置是在渲染回调中向其他合成线程发出信号,然后等待它们完成,然后将来自所有合成线程的音频混合在一起。

(一个明显的优化是,渲染回调本身运行一些处理,因为它已经在CPU上运行,否则将什么也不做)。

这就是问题所在。除非您可以确定synth渲染线程以实时优先级运行,否则每次运行渲染回调时,可能会遇到一次调度命中,如果您阻止回调线程等待synth渲染线程赶上,则可能会遇到另一次调度命中。

上次我在安卓系统上查看音频时,仿生缺乏一种设置实时线程优先级的方法(例如SCHED_FIFO)。在任何情况下,是否允许这样做都是操作系统策略的问题:在桌面Linux系统上,你要么需要是根用户,要么已经调整了适当的ulimit (作为根用户)-我不确定Android在这里做什么,但我非常怀疑下载的应用程序在默认情况下不会被赋予这个权限。也没有其他有用的权限,即将代码及其可能的堆栈需求mlock()到物理内存中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16987613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档