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字节的预期帧
知道那里发生了什么吗?
您说您正在以独占模式捕获音频,但在示例代码中,您使用AudioClientMode.Shared
调用Initialize
方法。我觉得共享模式不太可能让你在8kHz下工作。不像波浪。。。API,WASAPI不会为您重新采样播放或捕获,因此声卡本身必须以您指定的采样率运行。