我正在寻找一个从麦克风采集信号的代码示例 在扬声器上播放。我需要一个具有合理恒定延迟的解决方案 不同的平台(PC,android,iphone)。延迟大约1-2秒对我来说是可以的,我没有 如果每次申请开始时它都会变化,请注意。
我尝试在Sound和Microphpne classess上使用SampleDataEvent.SAMPLE_DATA事件。 一个事件会将数据放入缓冲区,另一个事件会读取数据。 但似乎无法提供持续的延迟,无论是延迟还是不断增长 它变得越来越低,我有少于2048个样本被推出,Sound类停止 生成SampleDataEvent.SAMPLE_DATA事件。
我不想处理每个传入的帧,所以使用setLoopBack(true)不是一个选项。
ps这在Android设备上比在PC上更成问题。当我开始调整应用程序的大小时 PC延迟窗口也开始增长。
请帮忙。
答案 0 :(得分:3)
不幸的是,这是不可能的......至少不是直接的。
某些声音设备将在录制和播放之间使用不同的时钟。对于运行麦克风的手机可能与耳机音频输出不同的硬件,尤其如此。
基本上,如果你以44.1kHz录制并以44.1kHz回放,但这些时钟不同步,你可能会以44.099kHz录制并以44.101kHz回放。随着时间的推移,这种漂移将意味着缓冲区中没有足够的数据发送到输出。
另一个并发症(很可能是您的问题)是您的记录和回放采样率可能不同。如果您以11kHz的麦克风录制并以48kHz的速度播放,您会注意到11不能均匀地适合48.软件通常用于对录音进行上采样。有时,这是通过一个很好的算法完成的,保证为您提供必要的输出。其他时候,11kHz将被推到44kHz并被认为“足够接近”。
简而言之,您不能依赖录制和播放设备同步,并且需要自己同步。有很多算法可以解决这个问题。最简单的方法是在此处和之后添加样本,在样本之前和之后平均样本。如果只使用少量样本进行此操作,则听不见。根据您所遇到的漂移问题,这可能就足够了。