You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中能否调用Google Pixel 8全部麦克风录制音频?

Google Pixel 8 多麦克风音频录制实现方案

直接使用MediaRecorder.AudioSource.MIC只能调用系统默认的单个麦克风,无法同时启用Pixel 8的全部三个内置麦克风(主麦、顶部麦、底部麦)。要实现多麦录制,必须借助更底层的AudioRecord API,Android Studio中完全可以完成这个需求,具体实现步骤如下:

1. 枚举所有内置麦克风设备

先通过系统API获取设备上所有可用的内置麦克风信息,拿到每个麦克风的唯一ID和设备实例:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
AudioDeviceInfo[] inputDevices = audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS);

List<AudioDeviceInfo> mics = new ArrayList<>();
for (AudioDeviceInfo device : inputDevices) {
    if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_MIC) {
        mics.add(device);
        Log.d("MIC_DETECT", "检测到麦克风ID: " + device.getId());
    }
}
// Pixel 8这里会返回3个内置麦克风实例

2. 为每个麦克风创建独立的AudioRecord实例

使用AudioSource.UNPROCESSED(绕过系统降噪/增益,保留原始信号,更适合捕捉低振幅低频声音),为每个麦克风配置单独的录制参数并初始化AudioRecord:

// 基础录制参数(针对低频低振幅建议用48kHz采样率、16位PCM)
int sampleRate = 48000;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int minBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

// 为每个麦克风创建录制实例
List<AudioRecord> recorders = new ArrayList<>();
for (AudioDeviceInfo mic : mics) {
    AudioRecord recorder = new AudioRecord(
            MediaRecorder.AudioSource.UNPROCESSED,
            sampleRate,
            channelConfig,
            audioFormat,
            minBufferSize * 2 // 增大缓冲区避免丢帧
    );
    recorder.setPreferredDevice(mic); // 指定绑定当前麦克风
    recorders.add(recorder);
}

3. 同步启动多线程录制

每个麦克风的录制需要单独开线程读取PCM数据,确保同步性并处理数据保存/合并:

// 启动所有录制
for (AudioRecord recorder : recorders) {
    recorder.startRecording();
}

// 为每个录制器开启线程读取数据
for (int i = 0; i < recorders.size(); i++) {
    final int micIndex = i;
    new Thread(() -> {
        AudioRecord recorder = recorders.get(micIndex);
        byte[] buffer = new byte[minBufferSize];
        FileOutputStream fos = null;
        try {
            // 为每个麦克风创建单独的PCM文件
            fos = new FileOutputStream(getExternalFilesDir(null) + "/mic_" + micIndex + ".pcm");
            while (isRecording) {
                int readSize = recorder.read(buffer, 0, buffer.length);
                if (readSize > 0) {
                    fos.write(buffer, 0, readSize);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            recorder.stop();
            recorder.release();
        }
    }).start();
}

4. 权限配置

确保在AndroidManifest.xml中声明必要权限,并动态申请危险权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

在代码中动态申请RECORD_AUDIO权限,Android 6.0及以上必须执行此步骤。

低频低振幅优化建议

  • 使用AudioSource.UNPROCESSED避免系统自动降噪/增益过滤掉弱信号;
  • 录制后可对PCM数据做软件增益处理,放大低振幅信号;
  • 选择较高的采样率(如48kHz)提升低频信号的捕捉精度。

内容的提问来源于stack exchange,提问作者user18421921

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:10:21