超过2个通道的NAudio WASAPI记录设备抛出不支持的格式错误

本文关键字:不支持 格式 错误 记录 通道 2个 NAudio WASAPI 超过 | 更新日期: 2023-09-27 18:10:09

我在使用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->控制面板_>声音设置将设备切换到2通道,代码工作正常这个问题有什么解决办法吗?我能以某种方式改变设备混合格式在飞行

超过2个通道的NAudio WASAPI记录设备抛出不支持的格式错误

我知道是怎么回事了。在NAudio库中有一个WasapiCapture类的构造函数

public WasapiCapture(MMDevice captureDevice)
{
     syncContext = SynchronizationContext.Current;
     audioClient = captureDevice.AudioClient;
     ShareMode = AudioClientShareMode.Shared;
     waveFormat = audioClient.MixFormat;
     if (waveFormat is WaveFormatExtensible wfe)
         try
         {
             waveFormat = wfe.ToStandardWaveFormat();
         }
         catch (InvalidOperationException)
         {
             // couldn't convert to a standard format
         }
}

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

// if (waveFormat is WaveFormatExtensible wfe)
//     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,它允许重新采样和改变通道的数量。最后,我有我需要的格式和我需要的通道数量。