0

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;
}

この関数を呼び出す前に、WaveFormat を (8000,1) に設定し、期間も 100 ミリ秒に設定しました。システムがバッファに 1600 バイトを割り当て、要求に応じて 100 ミリ秒の間隔が割り当てられると予想しました。

1. システムは audioClient.BufferSize を 4800 に割り当て、"this.recordBuffer" には 9600 バイトの配列を割り当てました (これは 100ms ではなく 600ms のバッファを意味します)。2. スレッドがスリープ状態になり、2400 サンプル (4800 バイト) を取得しますが、1600 バイトのフレームが期待どおりではありません。

そこに何が起こっているのか分かりますか?

4

1 に答える 1

2

排他モードでオーディオをキャプチャしていると言いますが、サンプル コードInitializeではAudioClientMode.Shared. 共有モードで 8kHz で作業できる可能性は非常に低いと思います。wave... API とは異なり、WASAPI は再生またはキャプチャのリサンプリングを行わないため、サウンドカード自体は指定したサンプル レートで動作している必要があります。

于 2013-02-15T07:49:48.303 に答える