gpt4 book ai didi

java - Android 中的实时音频处理

转载 作者:太空狗 更新时间:2023-10-29 15:20:00 25 4
gpt4 key购买 nike

我正在使用 AudioRecord.read 将 PCM 数据捕获为字节。但是,我发现它限制了至少使用 3904 个缓冲区来初始化 AudioRecord 对象。其中采样率为 44100。因为我需要对数据执行 FFT,所以我将样本增加到 4096。因此,回调每 40-60 毫秒运行一次,由 setPositionNotificationPeriod 设置为 500。由于进一步减少,持续时间不会进行任何更改。我想知道以下配置是否是最快的回调时间?

采样率:44100

channel :单声道

编码:PCM 16 BIT

缓冲区大小:4096

(不知道是4096还是2048因为我每次读取4096字节只能填2048个2bytes缓冲区)

即使是 40-60 毫秒也是可以接受的,然后我执行 FFT,最终在 200-300 毫秒左右阻止每个回调。而且还有很多噪声影响精度。我正在使用这些源代码:FFT in JavaComplex class

有没有其他选择可以执行快速、可靠且消耗更少内存的 FFT 处理?我发现上面的类新建了太多的对象并弹出了垃圾集合的消息负载。

最后,我有 3 个问题:

  1. 初始 bufferSize 是否等于我可以从 .read 方法读取的缓冲区?
  2. 使用 44100 采样率捕获音频数据是否有 40-60 毫秒的限制?
  3. 您能否推荐一些 FFT 库,以便我在处理 FFT 时有更好的性能? (我觉得是不是用C代码库比较好?)

抱歉我的英语不好,也感谢您花时间回答我的问题。

P.S 我在 iOS 上试过了,它只能以 44100 的采样率采集 512 个样本。所以每个回调只需要大约 10 毫秒。

最佳答案

关于问题 #3:可能不如本地库快,但我已经开始使用这些类,它们似乎适合实时工作(尽管我是从文件而不是麦克风读取): FFTPack .

最常见的 native 库是 KissFFT,您可以在 libGDX 中找到为 Android 编译的库。 .

关于java - Android 中的实时音频处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8832915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com