繁体   English   中英

Android中的实时音频处理

[英]Real time audio processing in Android

我正在使用AudioRecord.read将PCM数据捕获到字节。 但是,我发现它限制为使用至少3904个缓冲区初始化AudioRecord对象。 在采样率为44100的情况下。由于我需要对数据执行FFT,因此我将样本增加到4096.因此,回调每隔40-60ms由setPositionNotificationPeriod运行到500.由于进一步减少持续时间不会使任何变化。 如果这是以下配置的最快回拨时间,我会很擅长?

采样率:44100

频道:单声道

编码:PCM 16 BIT

BufferSize:4096

(我不确定它是4096还是2048,因为我每次读取4096个字节,它只能填充2048个2字节缓冲区)

甚至40-60ms是可以接受的,然后我执行FFT,最终阻止每个回调大约200-300ms。 并且仍然存在许多影响准确性的噪声。 我正在使用这些源代码: JavaComplex类中的 FFT

还有其他选择可以执行快速,可靠和消耗更少的内存处理FFT吗? 我发现上面的类新增了太多的对象并弹出了gragarbage collection的消息。

最后,我有3个问题:

  1. 初始bufferSize是否等于我可以从.read方法读取的缓冲区?
  2. 40-60ms是以44100采样率捕获音频数据的限制吗?
  3. 你能建议一些FFT库,以便在处理FFT时有更好的表现吗? (我想如果使用C代码库更好吗?)

抱歉我的英文不好,也谢谢你把时间花在我的问题上。

PS我在iOS上尝试过,它可以采用512个样本,采样率为44100。 所以每次回调只需要大约10ms。

关于问题3:可能没有本机库那么快,但我已经开始使用这些类,它们似乎适合实时工作(虽然我正在读取文件,而不是麦克风): FFTPack

最常见的本机库是KissFFT,你可以找到它作为libGDX的一部分为Android编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM