【问题标题】:need to understad how AudioRecord and AudioTrack work for raw PCM capture and playback需要了解 Audio Record 和 AudioTrack 如何用于原始 PCM 捕获和播放
【发布时间】:2013-08-21 04:48:34
【问题描述】:

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

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 数据。到目前为止,我是这样理解的:

随着while()循环的不断运行,record获得了SIZE_OF_RECORD_ARRAY个样本(目前为1024),如图。样本连续保存在 lin[] 短裤数组中(16 位短裤,因为我使用的是 16 位 PCM 编码)。这是由record.read() 完成的。然后track.write() 将这些样本放在由硬件播放的扬声器中。这是正确的还是我在这里遗漏了什么?

【问题讨论】:

    标签: android audio audiorecord audio-processing audiotrack


    【解决方案1】:

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

    说到音频的路径,你基本上是对的,尽管还涉及更多步骤:

    从内置麦克风录制时,您的步骤大致相同,只是它们的顺序相反。

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

    【讨论】:

    • 很抱歉,typically going through some kind of DSP that applies various acoustic compensation filters, 是什么意思?这是否意味着麦克风输入的数字表示不完全是麦克风上的内容?它是否已经通过硬件以某种方式进行了处理?
    • 同样,更改SIZE_OF_RECORD_ARRAY 似乎不会在输出中产生任何变化。我认为使这个值非常小会在输出上产生某种抖动或跳帧效果,但它似乎根本没有做任何事情
    • “是否已经以某种方式处理过?”。正确的。录制音频时应用的典型过滤器是自动增益控制或动态范围压缩和噪声抑制。
    • 您可以使用getMinBufferSize 方法查询AudioRecord 的最小缓冲区大小。
    • 拜托,让我试着用我理解的方式解释一下,如果我错了,请纠正我。所以这意味着,例如,如果我使用我的安卓设备录制纯音,同时在计算机上以相同的采样频率和 16 位 PCM 编码录制,并将结果保存为 wav 文件,然后比较两个wav文件中代表声音数据的文件中的十六进制值,它们会有所不同,因为android系统已经对录音应用了一些过滤器?
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多