我在线程中使用以下代码从麦克风捕获原始音频样本并通过扬声器播放。
public void run(){
short[] lin = new short[SIZE_OF_RECORD_ARRAY];
int num = 0;
// am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE); // -> MOVED THESE TO init()
// am.setMode(AudioManager.MODE_IN_COMMUNICATION);
record.startRecording();
track.play();
while (passThroughMode) {
// while (!isInterrupted()) {
num = record.read(lin, 0, SIZE_OF_RECORD_ARRAY);
for(i=0;i<lin.length;i++)
lin[i] *= WAV_SAMPLE_MULTIPLICATION_FACTOR;
track.write(lin, 0, num);
}
// /*
record.stop();
track.stop();
record.release();
track.release();
// */
}
哪里record
是一个AudioRecord
并且track
是一个Audiotrack
。我需要详细了解(如果可能,以简化的方式)AudioRecord 如何存储 PCM 数据和 AudioTrack 如何播放 PCM 数据。到目前为止,我是这样理解的:
随着while()循环的不断运行,record
得到SIZE_OF_RECORD_ARRAY个样本(目前为1024个)如图。样本连续保存在 lin[] 短裤数组中(16 位短裤,因为我使用的是 16 位 PCM 编码)。这是由record.read()
. 然后track.write()
将这些样本放入由硬件播放的扬声器中。这是正确的还是我在这里遗漏了什么?