2013-08-21 21 views
0

我用下面的代码在一个线程来捕捉来自麦克风原始音频采样和回放通过扬声器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(); 
      // */ 
     } 

其中recordAudioRecordtrackAudiotrack。我需要详细了解(如果可能,以简化方式)AudioRecord如何存储PCM数据,AudioTrack播放PCM数据。这是我迄今理解它:

enter image description here

作为while()循环连续地运行,record来获得样本的数量SIZE_OF_RECORD_ARRAY(这是1024现在)如该图所示。样本被连续保存在lin []阵列的短路中(16位短路,因为我使用的是16位PCM编码)。这由record.read()完成。然后track.write()将这些样本放置在由硬件播放的扬声器中。这是正确的还是我错过了什么?

回答

1

至于样品如何在存储器布局;它们只是一个线性近似于声波的阵列,在离散时间拍摄(如图所示)。在立体声的情况下,采样将被交错(LRLRLRLR ...)。

当涉及到音频所采取的路径,你基本上是正确的,虽然也有涉及几个步骤:

从内置麦克风进行录音时,除了按照相反的顺序进行操作外,您的步骤或多或少都会相同。

注意,某些步骤(基本上一切从音频HAL及以下)是特定于平台的,因此可以从不同的供应商(来自同一供应商甚至是不同的平台)平台之间的差异。

+0

我很抱歉,但你是怎么用'通常通过某种DSP的应用于各种声学补偿滤镜,去'是什么意思?这是否意味着麦克风输入的数字表示不完全在麦克风上?它是否已通过硬件以某种方式处理? – user13267

+0

同样,更改'SIZE_OF_RECORD_ARRAY'似乎不会在输出中产生任何变化。我以为使这个数值非常小会产生某种不安或帧跳跃的输出效果,但它似乎并没有这样做,在所有 – user13267

+0

什么_“是它已经以某种方式处理?” _。正确。录制音频时应用的典型滤波器有自动增益控制或动态范围压缩以及噪声抑制。 – Michael