AudioRecord缓冲区大小

时间:2017-02-21 11:24:00

标签: android 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.是否正确?

感谢。

1 个答案:

答案 0 :(得分:4)

  

我必须从缓冲区读取短路,因为我指定了ENCODING_PCM_16BIT。这是对的吗?

你应该,但你不一定要这样做。您可以将示例读取到byte[],但在将byte转换为short时,您可以自行处理字节序。

  

如果最小缓冲区大小(以字节为单位)为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();