我按照以下方式初始化我的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。这样做对吗?
谢谢。
bufferSizeInBytes
为8192个单位来初始化我的AudioRecord实例。这样正确吗? - Adriano Di GiovanniAudioRecord#read
,操作会一直阻塞直到所有样本都被读取。这是正确的吗? - Adriano Di GiovannibufferSizeInBytes
来说太大了。我会使用getMinBufferSize()
创建一个AudioRecord
,或者使用它的几倍。 - nandsitoread()
是一个阻塞调用。 - nandsitoread()
的文档。关键在于read()
不一定会在单次调用中返回所有所需的样本。它可能会返回较少的样本。因此建议您读取样本,直到您有足够的数量。 - nandsito