1

我在使用 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 通道,代码工作正常 有没有解决这个问题?我可以以某种方式即时更改设备混合格式吗

4

1 回答 1

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 bit PCM: 44kHz 6 channels wBitsPerSample:32 dwChannelMask:1551 subFormat:00000003-0000-0010-8000-00aa00389b71 extraSize:22}

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

  • 我创建了 MyWasapiCapture 类,它是原始 WasapiCapture 的副本,但代码被注释掉了
  • 将数据按原样保存到缓冲区
  • 通过 NAudio.Wave.MediaFoundationResampler 传递它,它允许重新采样和更改通道数。最后我有我需要的格式和我需要的频道数量。
于 2014-06-29T11:06:18.263 回答