【问题标题】:how to eliminate latency and echo from the direct-monitoring using AsioOut (NAudio)如何使用 AsioOut (NAudio) 消除直接监控的延迟和回声
【发布时间】:2014-05-09 21:32:20
【问题描述】:

基于我提出的这个问题: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。我不知道为什么,但是没有它,你会听到一阵阵的声音。

【问题讨论】:

    标签: c# echo naudio latency aec


    【解决方案1】:

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

    【讨论】:

    • “缓冲区大小”是指BufferedWaveProvider.BufferLength?如果答案是肯定的,那么这是我的缓冲区大小:882000
    • 不,我的意思是 ASIO 缓冲区大小。应该在您的声卡的 ASIO 控制面板上可见
    • 好的,输入输出缓冲区的大小都是2048同步参考 i> 设置为 输入。虽然 audio buffer 的大小没有定义并且它是标准的:10ms.. 我试图改变这些值,我得到了一个稍微低一点的延迟,只是似乎离这个想法有点远​​​低延迟ASIO(
    • 这就是 ASIO 的工作方式。顺便说一句,您使用 BufferedWaveProvider 做什么?您的代码示例似乎根本没有使用它?
    • 我使用了BufferedWaveProvider,因为您在我在顶部链接的帖子中建议我使用它。它仅用于定义输出通道的数量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    相关资源
    最近更新 更多