2017-02-21 5 views
0

は、私は私のaudiorecordのインスタンスを初期化します。ここではaudiorecordのバッファサイズ

// TODO: remember to add RECORD_AUDIO permission 
int audioSource = MediaRecorder.AudioSource.MIC; 

// TODO: I should consider Nyquist frequency and tell the user if her device can correctly detect frequencies in the range of her instrument 
int sampleRateInHz = getDeviceSampleRate(context); 

int channelConfig = AudioFormat.CHANNEL_IN_MONO; 
int audioFormat = AudioFormat.ENCODING_PCM_16BIT; 

// TODO: bufferSizeInBytes should be set according to minimum detectable frequency in order to have at least three periods 
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat); 

AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz, channelConfig, audioFormat, bufferSizeInBytes); 

は私の質問です:

  • 私はENCODING_PCM_16BITを指定したので、私は、バッファからのショートパンツを読まなければなりません。それが正しいか?
  • バッファの最小サイズ(バイト)が1000の場合、500の短絡があります。ですから、4096サンプルが必要な場合は、bufferSizeInBytesを8192に設定する必要があります。正しいですか?

ありがとうございます。

答えて

2

私はENCODING_PCM_16BITを指定したので、バッファからショートを読み取る必要があります。それが正しいか?

必ずしもそうではありません。サンプルをbyte[]に読み込むこともできますが、byteshortに変換するときにエンディアンを処理するのはあなた次第です。

バッファの最小サイズを1000バイトにすると、500個のショートがあります。ですから、4096サンプルが必要な場合は、bufferSizeInBytesを8192に設定する必要があります。正しいですか?

実際には、

最小バッファサイズは、AudioRecordインスタンスが受け入れる最小サイズです。それは閾値のようなものです。 AudioRecord constructor documentation

getMinBufferSize()より小さい値を使用すると初期化に失敗します。

場合によっては、バッファサイズを最小値より大きくすることができます。 AudioRecord.getMinBufferSize() documentation`は言う:

注意このサイズは負荷の下で円滑な記録を保証するものではありませんし、より高い値がaudiorecordのインスタンスは、新しいデータのためにポーリングされる期待される頻度に応じて選択する必要があること。

ここでは4096の16ビットサンプル読み取るためのアルゴリズムです:あなたは返信用

ByteArrayOutputStream mainBuffer = new ByteArrayOutputStream(); 

int minimumBufferSize = AudioRecord.getMinBufferSize(...); 

byte[] readBuffer = new byte[minimumBufferSize]; 

AudioRecord recorder = new AudioRecord(..., minimumBufferSize); 

recorder.startRecording(); 

while (mainBuffer.size() < 8192) { 

    // read() is a blocking call 
    int bytesRead = recorder.read(readBuffer, 0, minimumBufferSize); 

    mainBuffer.write(readBuffer, 0, bytesRead); 
} 

recorder.stop(); 

recorder.release(); 
+0

おかげで。 「データは、録音バッファーの総容量を下回るサイズのチャンクでオーディオハードウェアから読み取る必要があります。 ([AudioRecord](https://developer.android.com/reference/android/media/AudioRecord.html))。したがって、私が4096サンプルを分析する必要があり、短編を読むつもりならば、私はAudioRecordインスタンスを8192ユニットの 'bufferSizeInBytes'を使って初期化する必要があります。それが正しいか? –

+0

投稿したアルゴを実装する必要があるのはなぜですか? 'AudioRecord#read'を呼び出すと、すべてのサンプルが読み込まれるまで操作はブロックされます。それが正しいか? –

+0

@AdrianoDiGiovanni私は8192が 'bufferSizeInBytes'には大きすぎると思います。私は 'AudioRecord'を' getMinBufferSize() 'またはその倍数で作成します – nandsito