具有2个以上频道的NAudio WASAPI录制设备会抛出不支持的格式错误

时间:2014-06-25 12:26:46

标签: c# naudio wasapi

我遇到了使用NAdio库录制具有6或8个频道的WASAPI环回设备的问题。 例如。设备具有以下波形格式: 32位PCM:44kHz 6通道wBitsPerSample:32

public MMDevice Device;
private WasapiCapture _waveIn;
.....
.....
_waveIn = IsLoopback ? new WasapiLoopbackCapture(Device) : new WasapiCapture(Device);

           _waveIn.DataAvailable += OnDataAvailable;
           _waveIn.RecordingStopped += OnRecordingStopped;
           _waveIn.StartRecording();

StartRecording “不支持的波形格式”错误时崩溃 错误来自WasapiCapture.InitializeCaptureDevice(),同时调用

if (!audioClient.IsFormatSupported(ShareMode, WaveFormat))
        {
            throw new ArgumentException("Unsupported Wave Format");
        }

如果我使用windows-> control panel_>声音设置将设备切换到2声道,则代码可以正常工作 有没有解决这个问题?我可以以某种方式动态更改设备mixformat

1 个答案:

答案 0 :(得分:0)

我发现了正在发生的事情。在NAudio库中有一个WasapiCapture类的构造函数

public WasapiCapture(MMDevice captureDevice)
        {
            syncContext = SynchronizationContext.Current;
            audioClient = captureDevice.AudioClient;
            ShareMode = AudioClientShareMode.Shared;

            waveFormat = audioClient.MixFormat;
            var wfe = waveFormat as WaveFormatExtensible;
            if (wfe != null)
            {
                try
                {
                    waveFormat = wfe.ToStandardWaveFormat();
                }
                catch (InvalidOperationException)
                {
                    // couldn't convert to a standard format
                }
            }
        }

它使用WaveFormat.ToStandardWaveFormat()。我试图将标注更改为标准的部分注释掉

//var wfe = waveFormat as WaveFormatExtensible;
//if (wfe != null)
//{
//    try
//    {
//        waveFormat = wfe.ToStandardWaveFormat();
//    }
//    catch (InvalidOperationException)
//    {
//        // couldn't convert to a standard format
//    }
//}

在我的情况下,我只是离开原始[NAudio.Wave.WaveFormatExtensible] = {32位PCM:44kHz 6通道wBitsPerSample:32 dwChannelMask:1551 subFormat:00000003-0000-0010-8000-00aa00389b71 extraSize:22}

现在WasapiCapture.InitializeCaptureDevice()正在成功运行,我正在获取数据。

  • 我创建了MyWasapiCapture类,它是原始WasapiCapture的副本,除了代码注释掉
  • 将数据保存到缓冲区
  • 将其传递给NAudio.Wave.MediaFoundationResampler,它允许重新采样和更改通道数。最后,我需要的格式是我需要的频道数。