WasapiCapture NAudio

本文关键字:NAudio WasapiCapture | 更新日期: 2023-09-27 17:58:56

我们正在使用用c#编写的NAudio堆栈,并试图用PCM 8kHZ和每个样本16位在独占模式下捕获音频。

在以下功能中:

private void InitializeCaptureDevice()
{
    if (initialized)
        return;
    long requestedDuration = REFTIMES_PER_MILLISEC * 100;
    if (!audioClient.IsFormatSupported(AudioClientShareMode.Shared, WaveFormat) && 
        (!audioClient.IsFormatSupported(AudioClientShareMode.Exclusive, WaveFormat)))
    {
        throw new ArgumentException("Unsupported Wave Format");
    }
    var streamFlags = GetAudioClientStreamFlags();
    audioClient.Initialize(AudioClientShareMode.Shared,
        streamFlags,
        requestedDuration,
        requestedDuration,
        this.waveFormat,
        Guid.Empty);
    int bufferFrameCount = audioClient.BufferSize;
    this.bytesPerFrame = this.waveFormat.Channels * this.waveFormat.BitsPerSample / 8;
    this.recordBuffer = new byte[bufferFrameCount * bytesPerFrame];
    Debug.WriteLine(string.Format("record buffer size = {0}", this.recordBuffer.Length));
    initialized = true;
}

在将此函数调用为(8000,1)之前,我们配置了WaveFormat,并且还配置了100毫秒的周期。我们期望系统按照要求为缓冲区和100ms的间隔分配1600字节。

但我们注意到发生了以下情况:1.系统将audioClient.BufferSize分配为4800,并将"this.recordBuffer"分配为9600字节的数组(这意味着缓冲区为600ms,而不是100ms)。2.线程将进入睡眠状态,然后获得2400个样本(4800字节),而不是1600字节的预期帧

知道那里发生了什么吗?

WasapiCapture NAudio

您说您正在以独占模式捕获音频,但在示例代码中,您使用AudioClientMode.Shared调用Initialize方法。我觉得共享模式不太可能让你在8kHz下工作。不像波浪。。。API,WASAPI不会为您重新采样播放或捕获,因此声卡本身必须以您指定的采样率运行。