우리는 C#으로 작성된 NAudio Stack을 사용하고 PCM 8kHZ 및 샘플 당 16 비트를 사용하여 독점 모드로 오디오를 캡처하려고합니다. 다음 함수에서WasapiCapture NAudio
는 :
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)이 기능 또한 100 ms의 기간 전에 WAVEFORMAT을 구성. 요청에 따라 버퍼에 1600 바이트를 할당하고 100ms 간격으로 시스템을 할당 할 것으로 예상했습니다.
그러나가 발생한 다음 확인했습니다 audioClient.BufferSize 1. 분배 시스템은 4800되어야하고 "this.recordBuffer"(600ms의 아니라 100ms로하는 버퍼 수단) 9600 바이트의 배열. 2. 스레드가 잠자기 후 2400 샘플 (4800 바이트)을 가져오고 1600 바이트의 예상 프레임이 아님
어떤 아이디어가 있습니까?
+ 코드가 버퍼 할당량에 도달하면 + 모드 (공유, 배타) 중 하나에서 지원을 확인하지만 공유로 초기화하려고 시도합니다. 코드가 주제 질문과 관련이없는 것 같습니다. –
WASAPI API가 리샘플링을 수행하지 않으면 왜 WaveFormat 속성을 설정할 수 있습니까? – Puppy
독점 모드에서는 사운드 카드를 작동시킬 샘플 속도를 지정할 수 있습니다 (단, 이것도 제한적입니다 - 보통 44.1 및 48kHz 만 옵션입니다) –