4

我正在寻找一个从麦克风采样信号并在扬声器上播放的代码示例。我需要一个在不同平台(PC、android、iphone)上具有合理恒定延迟的解决方案。延迟大约 1-2 秒对我来说是可以的,我不介意每次应用程序启动时它都会变化。

我尝试在 Sound 和 Microphpne 类上使用 SampleDataEvent.SAMPLE_DATA 事件。一个事件将数据放入缓冲区,另一个事件将读取数据。但是似乎不可能提供恒定的延迟,要么延迟不断增长,要么降低到我要输出的样本少于 2048 个并且 Sound 类停止生成 SampleDataEvent.SAMPLE_DATA 事件的程度。

我不想处理每个传入的帧,所以使用 setLoopBack(true) 不是一个选项。

ps 这在 Android 设备上比在 PC 上更容易出现问题。虽然当我开始在 PC 上调整应用程序窗口大小时,延迟也开始增长。

请帮忙。

4

1 回答 1

3

不幸的是,这是不可能的……至少不是直接的。

某些声音设备将在录制和播放之间使用不同的时钟。对于手机来说尤其如此,其中运行麦克风的硬件很可能与耳机音频输出不同。

基本上,如果您以 44.1kHz 录制并以 44.1kHz 播放,但这些时钟不同步,您可能会以 44.099kHz 录制并以 44.101kHz 播放。随着时间的推移,这种漂移将意味着缓冲区中没有足够的数据发送到输出。

另一个复杂因素(很可能是您的问题)是您的记录和播放采样率可能不同。如果您从麦克风以 11kHz 录制并以 48kHz 播放,您会注意到 11 不能均匀地适合 48。软件通常用于对录音进行上采样。有时这是通过一个很好的算法来完成的,该算法可以保证为您提供必要的输出。其他时候,11kHz 将被推到 44kHz 并被认为“足够接近”。

简而言之,您不能依赖录制和播放设备同步,而需要自己同步。有很多算法可以处理这个问题。最简单的方法是在这里和那里添加一个样本,以平均它之前和之后的样本。如果您只使用几个样本进行此操作,您将听不见。根据您遇到的漂移问题,这可能就足够了。

于 2012-11-30T15:24:43.240 回答