2013-02-13 7 views
0

우리는 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 바이트의 예상 프레임이 아님

어떤 아이디어가 있습니까?

답변

1

오디오를 배타 모드로 캡처하고 있지만 예제 코드에서는 AudioClientMode.Shared으로 Initialize 메서드를 호출한다고 가정합니다. 공유 모드를 사용하면 8kHz에서 작동 할 가능성이 매우 적습니다. 웨이브 API와는 달리, WASAPI는 재생이나 캡처의 리샘플링을하지 않으므로 사운드 카드 자체가 지정한 샘플 속도로 작동해야합니다.

+0

+ 코드가 버퍼 할당량에 도달하면 + 모드 (공유, 배타) 중 하나에서 지원을 확인하지만 공유로 초기화하려고 시도합니다. 코드가 주제 질문과 관련이없는 것 같습니다. –

+0

WASAPI API가 리샘플링을 수행하지 않으면 왜 WaveFormat 속성을 설정할 수 있습니까? – Puppy

+0

독점 모드에서는 사운드 카드를 작동시킬 샘플 속도를 지정할 수 있습니다 (단, 이것도 제한적입니다 - 보통 44.1 및 48kHz 만 옵션입니다) –