0

我在线程中使用以下代码从麦克风捕获原始音频样本并通过扬声器播放。

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()将这些样本放入由硬件播放的扬声器中。这是正确的还是我在这里遗漏了什么?

4

1 回答 1

1

至于样本在内存中的布局方式;它们只是声波的线性近似数组,在离散时间拍摄(如您的图所示)。在立体声的情况下,样本将被交错(LRLRLRLR...)。

当谈到音频采用的路径时,您基本上是对的,尽管还涉及更多步骤:

从内部麦克风录制时,您的步骤或多或少相同,只是它们的顺序相反。

请注意,其中一些步骤(基本上来自音频 HAL 及以下的所有步骤)是特定于平台的,因此在不同供应商的平台之间可能会有所不同(甚至是同一供应商的不同平台)。

于 2013-08-21T08:24:59.883 回答