我正在使用AudioRecord类时遇到一些问题。我想要将录制的数据存储在缓冲区中,但是我不确定正确的方法是什么。我查看了大量的示例,但其中大多数都很复杂并且代表了许多不同的方法。我正在寻找一个简单的方法或简单的解释。
以下是我的项目音频设置:
我知道我应该使用 .read(short[] audioData, int offsetInShorts, int sizeInShorts) 函数。这时我的问题开始了。我不确定 audioData 缓冲区的工作原理 - 我假设函数将录制的样本放入 audioData 中。如果它已经完全填满数据会发生什么?它会从最早的位置开始重写吗?如果是,我相信我必须将所有收集到的样本复制到其他地方。这引发了另一个问题 - 我如何检查 .read(...) 函数缓冲区是否已满?我需要测量时间并复制缓冲区内容,还是有另一种方法可以实现?此外,我需要为整个录音操作创建一个线程吗?
对于在同一个主题中提出这么多问题我感到抱歉 :)
以下是我的项目音频设置:
int audioSource = AudioSource.MIC;
int sampleRateInHz = 8000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
short[] buffer = new short[bufferSizeInBytes];
AudioRecord audioRecorder = new AudioRecord(audioSource,
sampleRateInHz,
channelConfig,
audioFormat,
bufferSizeInBytes);
我正在尝试创建一个录音功能:
public void Recording() {
audioRecorder.startRecording();
...
audioRecorder.stop();
audioRecorder.release();
}
我知道我应该使用 .read(short[] audioData, int offsetInShorts, int sizeInShorts) 函数。这时我的问题开始了。我不确定 audioData 缓冲区的工作原理 - 我假设函数将录制的样本放入 audioData 中。如果它已经完全填满数据会发生什么?它会从最早的位置开始重写吗?如果是,我相信我必须将所有收集到的样本复制到其他地方。这引发了另一个问题 - 我如何检查 .read(...) 函数缓冲区是否已满?我需要测量时间并复制缓冲区内容,还是有另一种方法可以实现?此外,我需要为整个录音操作创建一个线程吗?
对于在同一个主题中提出这么多问题我感到抱歉 :)