AcmNotPossible 使用 WaveFormatConversionStream 调用 acmStreamOpen

AcmNotPossible calling acmStreamOpen with WaveFormatConversionStream

我想做的是将 WaveIn 麦克风输入转换为不同的 WaveFormat,并将其添加到 MixingSampleProvider。

        WaveIn waveIn = new WaveIn(this.Handle);
        waveIn.BufferMilliseconds = 25;
        waveIn.DataAvailable += waveIn_DataAvailable;

        // create wave provider
        WaveProvider waveProvider = new BufferedWaveProvider(waveIn.WaveFormat);
        WaveFormat commonWaveFormat = WaveFormat.CreateIeeeFloatWaveFormat(44100, 2);
        MixingSampleProvider msp = new MixingSampleProvider(commonWaveFormat);
        WaveFormatConversionStream wfcs = new WaveFormatConversionStream(commonWaveFormat,new WaveProviderToWaveStream(waveProvider));
        msp.AddMixerInput(wfcs);
        // create wave output to speakers
        waveOut = new WaveOut();
        waveOut.DesiredLatency = 100;
        waveOut.Init(msp);

其中 WaveProviderToWaveStream 是来自 this answer 的 class。 但是,这在 WaveFormatConversionStream.

处给了我以下异常
NAudio.MmException:AcmNotPossible calling acmStreamOpen

我试过了

msp.addMixerInput(MediaFoundationResampler(waveProvider, commonWaveFormat).toSampleProvider());

虽然有效,但在对着麦克风说话和听到输出之间产生了太大的延迟。

您只需在 WaveIn 对象本身上指定要记录的格式会容易得多。 (在开始录音前设置WaveFormat 属性即可。应该还是16位PCM,但要指定你想要的采样率和通道数)

然后您可以使用 ToSampleProvider 扩展方法将您的 BufferedWaveProvider 变成 ISampleProvider,这样您就可以将它添加到 MixingSampleProvider