实时错误wasapi捕获(来自声卡)操纵和播放

时间:2016-12-28 13:19:52

标签: c# audio naudio

我正试图捕捉通过电脑进行操作并在realTime中播放的所有声音(由于操作可能会有轻微的延迟,但不会太严重)。

我正在尝试使用Naudio wasapi。问题是: 当我以独占模式执行此操作时,此行:audioClient.Initialize(shareMode, AudioClientStreamFlags.EventCallback, latencyRefTimes, latencyRefTimes,outputFormat, Guid.Empty);

抛出此异常:

  

NAudio.dll中出现未处理的“System.Runtime.InteropServices.COMException”类型异常

     

其他信息:HRESULT:0x88890016

当我在共享模式下执行此操作时,我会收到很多噪音,我认为这是由声音反馈引起的(类似于同时录制和播放时会发生什么)

这是我的代码:

WasapiLoopbackCapture source = new WasapiLoopbackCapture();

        source.DataAvailable += CaptureOnDataAvailable;

        bufferedWaveProvider = new BufferedWaveProvider(source.WaveFormat);

        volumeProvider = new VolumeSampleProvider(bufferedWaveProvider.ToSampleProvider());

        WasapiOut soundOut = new WasapiOut(AudioClientShareMode.Shared, 0);

        soundOut.Init(volumeProvider);
        soundOut.Play();

        source.StartRecording();

        soundOut.Volume = 0.5f;
    }

    private void CaptureOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
    {

        int length = waveInEventArgs.Buffer.Length;

        byte[] byteSamples = new Byte[length];
        float[] buffer = waveInEventArgs.Buffer.toFloatArray(waveInEventArgs.BytesRecorded);//buffer to contains the samples about to be manipulated


        fixer.fixSamples(length / 2, buffer, ref fixedSamples);


        if (fixedSamples.Count > 0)
        {
            //convert the fixed samples back to bytes in order for them to be able to play out
            byteSamples = fixedSamples.convertToByteArray(position);

            bufferedWaveProvider.AddSamples(byteSamples, 0, byteSamples.Length);
            volumeProvider.Volume = .5f;
        }

        position = fixedSamples.Count;

    }

我该如何解决这些问题?

另外,我不知道这是否是我尝试做的最佳方法,所以如果有人更好地了解如何做到这一点,我会非常高兴听到。 (我想过使用asio,但决定不要因为有很多没有asio驱动程序的计算机)

1 个答案:

答案 0 :(得分:0)

此错误为AUDCLNT_E_UNSUPPORTED_FORMAT 您只能使用WASAPI捕获某些格式的音频。通常必须是IEEE float,stereo,44.1kHz / 48kHz