我用下面的代码在一个线程来捕捉来自麦克风原始音频采样和回放通过扬声器AudioRecord和AudioTrack是如何工作的。需要understad为原料PCM采集和回放
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()
将这些样本放置在由硬件播放的扬声器中。这是正确的还是我错过了什么?
我很抱歉,但你是怎么用'通常通过某种DSP的应用于各种声学补偿滤镜,去'是什么意思?这是否意味着麦克风输入的数字表示不完全在麦克风上?它是否已通过硬件以某种方式处理? – user13267
同样,更改'SIZE_OF_RECORD_ARRAY'似乎不会在输出中产生任何变化。我以为使这个数值非常小会产生某种不安或帧跳跃的输出效果,但它似乎并没有这样做,在所有 – user13267
什么_“是它已经以某种方式处理?” _。正确。录制音频时应用的典型滤波器有自动增益控制或动态范围压缩以及噪声抑制。 – Michael