动作脚本:通过扬声器(通过缓冲器)以恒定延迟从麦克风播放声音

时间:2012-11-28 13:16:24

标签: actionscript-3 flash audio actionscript signal-processing

我正在寻找一个从麦克风采集信号的代码示例 在扬声器上播放。我需要一个具有合理恒定延迟的解决方案 不同的平台(PC,android,iphone)。延迟大约1-2秒对我来说是可以的,我没有 如果每次申请开始时它都会变化,请注意。

我尝试在Sound和Microphpne classess上使用SampleDataEvent.SAMPLE_DATA事件。 一个事件会将数据放入缓冲区,另一个事件会读取数据。 但似乎无法提供持续的延迟,无论是延迟还是不断增长 它变得越来越低,我有少于2048个样本被推出,Sound类停止 生成SampleDataEvent.SAMPLE_DATA事件。

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

ps这在Android设备上比在PC上更成问题。当我开始调整应用程序的大小时 PC延迟窗口也开始增长。

请帮忙。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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