如何使用AsioOut(NAudio)消除直接监控的延迟和回声

时间:2014-03-30 16:19:48

标签: c# echo naudio latency aec

基于我提出的这个问题:How to record and playback with NAudio using AsioOut

使用此代码:

[DllImport("Kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
private static unsafe extern void MoveMemory(IntPtr dest, IntPtr src, int size);

private void OnAudioAvailable(object sender, AsioAudioAvailableEventArgs e)
{
     for (int i = 0; i < e.InputBuffers.Length; i++)
     {
          MoveMemory(e.OutputBuffers[i], e.InputBuffers[i], e.SamplesPerBuffer * e.InputBuffers.Length);
     }

     e.WrittenToOutputBuffers = true;
}

这样做有点延迟和一点回声,我不知道如何解决它们。

我搜索了网络上的库,这些库允许我消除回声( AEC ),但没有找到对C#有用的东西。有谁知道如何帮助我?

编辑1 :我的AsioOut.PlaybackLatency是2048毫秒。它有点太高了..

编辑2 :我尝试使用耳机,我注意到回声只是由于麦克风和扬声器之间的接近,所以这不是问题,尽管有一个AEC会很有趣

问题已解决:我解决了延迟问题。这是我的ASIO驱动程序的问题,我卸载了Cubase并且我安装了ASIO4ALL驱动程序,现在它工作正常。 PS :我必须在MoveMemory的最后一个参数中添加 * 2 。我不知道为什么,但如果没有它,你会听到喷出的声音。

1 个答案:

答案 0 :(得分:0)

您使用的缓冲区大小是多少?请记住,如果您正在录制和播放音频,则完全无法消除所有延迟。大多数ASIO驱动程序允许您进入相当低的延迟(低于10毫秒),但您还需要确保声卡的任何直接监视功能都已关闭,否则您将听到回声。