2016-03-23 18 views
1

オーディオの録音は次のように機能します。録音して録音することができます。奇妙なことは、完全には満たされていないバッファでコールバック関数が呼び出されることがあることだけです。 私はStreamCallback機能にinNumPackets変数の値を記録している、と順序は次のようになります、iOSオーディオ録音コールバックでオーディオバッファがいっぱいになっていないのはなぜですか?

2048、2048、2048、2048、2048、2048、2048、2048、2048、2048、を2048、2048、2048、2048、2048、2048、2048、2048、2048、、2048年、2048年、

バッファを処理するコードは、現在、私はすべての時間Aの成果物を得ることを意味する、固定サイズに依存していますバッファは満たされません。

バッファをフルにするために何かできますか? - それとも期待される行動ですか?

私のコードからいくつかの抽出物:

DataFormat.mFormatID := kAudioFormatLinearPCM; 
DataFormat.mSampleRate := 44100; 
DataFormat.mChannelsPerFrame := 1; 
DataFormat.mBitsPerChannel := 16; 
DataFormat.mBytesPerPacket := 2; 
DataFormat.mBytesPerFrame := 2; 
DataFormat.mFramesPerPacket := 1; 
DataFormat.mFormatFlags := kLinearPCMFormatFlagIsSignedInteger OR kLinearPCMFormatFlagIsPacked; 

lStatus := AudioQueueNewInput(@DataFormat,@StreamCallback,nil,nil,kCFRunLoopCommonModes,0,fAqDataQueue); 
... 
//allocate 3 buffers with a buffer size of 2048 packets with 2 bytes per packet 
AudioQueueAllocateBuffer(fAqDataQueue,2*2048,fAqDataBuffers[li]); 

答えて

2

あなたが固定サイズのiOSのCore Audioのバッファに依存処理を使用することはできません。これは、iOSがアプリケーションの制御外の理由(デバイスで実行中の他のオーディオプロセスで必要とされるサンプルレートのリサンプリングや、デバイスのハードウェア機能のため、またはさまざまな省電力など)によってオーディオユニットのバッファサイズを自由に変更できるためですモードなど)

固定サイズのバッファを処理する必要がある場合は、着信オーディオユニットサンプルにロックフリーの循環FIFO /バッファを使用し、そのFIFOをポーリングして処理ステップに十分なサンプルが含まれているかどうかを確認します。詳細はthis answerを参照してください。

関連する問題