c# - NAudio效果不起作用,并且在不同的声卡上的行为不同

标签 c# .net audio naudio audioeffect

我将 NAudio WasapiLoopbackCapture WaveOut 结合使用,以创建全局回声效果,即影响当前音频输出。

但是,我的实现对我来说似乎很差,根本无法正常工作。在每台计算机上,它听起来都不一样,有时甚至崩溃。

这是我想出的代码。它使用 WaveOut 记录音频输出,并每75ms播放一次记录的流。

我在这里做错什么,如何改善?

private static void CreateReverb()
{
    MemoryStream loopbackWave = new MemoryStream();
    DateTime lastEcho = DateTime.Now;

    WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
    waveIn.StartRecording();
    waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
    {
        loopbackWave.Write(e.Buffer, 0, e.BytesRecorded);
        if ((DateTime.Now - lastEcho).TotalMilliseconds > 75)
        {
            lastEcho = DateTime.Now;
            byte[] loopbackBytes = loopbackWave.ToArray();
            loopbackWave.Dispose();
            loopbackWave = new MemoryStream();

            using (MemoryStream waveStream = new MemoryStream())
            {
                using (WaveFileWriter waveFileWriter = new WaveFileWriter(waveStream, waveIn.WaveFormat))
                {
                    waveFileWriter.Write(loopbackBytes, 0, loopbackBytes.Length);
                }
                loopbackBytes = waveStream.ToArray();
            }

            for (int i = 0; i < 3; i++)
            {
                ThreadPool.QueueUserWorkItem(delegate
                {
                    try
                    {
                        WaveOut waveOut = new WaveOut();
                        waveOut.Init(new WaveFileReader(new MemoryStream(loopbackBytes)));
                        waveOut.Volume = ReverbIntensity * .5f;
                        waveOut.Play();
                        Thread.Sleep(200);
                        waveOut.Dispose();
                    }
                    catch { }
                });
            }
        }
    };
}

编辑:第二次尝试:

这次,我尝试使用Mark建议的BufferedWaveProvider。问题在于回放没有延迟,因此创建了反馈回路而不是回声。输出必须约为.5f,并且必须具有约75ms的延迟才能使其正常工作。
private static void CreateReverb()
{
    DateTime lastEcho = DateTime.Now;

    WasapiLoopbackCapture waveIn = new WasapiLoopbackCapture();
    BufferedWaveProvider bufferedWaveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
    WasapiOut wasapiOut = new WasapiOut(AudioClientShareMode.Shared, 0);

    bufferedWaveProvider.DiscardOnBufferOverflow = true;
    wasapiOut.Init(bufferedWaveProvider);
    wasapiOut.Play();
    waveIn.StartRecording();

    waveIn.DataAvailable += delegate(object sender, WaveInEventArgs e)
    {
        bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded);
    };
}

最佳答案

不要继续打开数百个WaveOut实例。您应该只有一个WaveOut实例,该实例是从一个自定义流开始播放的,该流从录制的音频开始(一个BufferedWaveProvider是一个很好的起点),然后将其传递给您的效果。做到这一点的最佳方法是创建ISampleProvider的实现,该实现以Read方法从源提供者读取,然后执行效果。

最后,您正在捕获带有回送音频的声音,然后从同一设备播放该声音,这本身可能会造成讨厌的反馈循环。

关于c# - NAudio效果不起作用,并且在不同的声卡上的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29016307/

相关文章:

c# - 使用 Caliburn Micro 将 EventAggregator 注入(inject) ViewModel

c# - .NET 反序列化后 XML 中的对象位置(行、列)

.net - .NET中的生产者消费者链和线程调度

javascript - React Player 和加载多个 URL 源

c++ - 使用 QAudioProbe 从原始数据中绘制波形

c# - 断点未命中 ItemDataBound 函数

c# - 如何使用 LINQ 返回 FileInfo.Name 的子字符串

java.awt.Toolkit beep() 错误

c# - WPF 绑定(bind)语法

.net - 对于使用 CQRS 的 ASP.NET MVC 应用程序来说,什么是好的读取模型?