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

Android TV双麦克风录音:AudioRecorder双声道数据重复问题

嘿,我之前也踩过Android立体声录制的坑,结合你给出的PCM数据和场景,咱们来一步步排查解决这个问题:

问题定位

从你提供的PCM数据片段(比如79, -21, 79, -21)能明显看出来,每一组4字节的立体声数据里,前两个字节和后两个字节完全重复——这说明AudioRecorder实际上只在录制单声道数据,然后系统自动把单声道数据复制填充到了两个通道,所以拆分后左右声道内容完全一致。

可能的原因

  • AudioRecorder声道配置错误:你可能不小心把声道设成了CHANNEL_IN_MONO,或者虽然指定了CHANNEL_IN_STEREO,但你的Android TV系统没正确识别双麦音频卡的立体声输入能力。
  • 系统/硬件限制:有些Android TV设备即使硬件支持双麦,系统默认也会强制单声道录制,或者音频卡驱动没正确暴露立体声输入接口。
  • 拆分逻辑问题:这个可能性从你的数据来看比较低,但还是要确认拆分代码的正确性。

解决方案

1. 检查并修正AudioRecorder初始化参数

首先确保你用了正确的立体声配置,尤其是CHANNEL_IN_STEREO,同时要匹配设备支持的采样率和格式:

// 立体声录制的标准配置示例
int audioSource = MediaRecorder.AudioSource.MIC;
int sampleRate = 44100; // 也可以尝试48000,看设备支持情况
int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 一定要用立体声参数计算最小缓冲区大小
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
    AudioRecord recorder = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize);
    // 后续录制逻辑...
} else {
    Log.e("StereoRecord", "当前设备不支持该立体声配置");
}

重点:调用getMinBufferSize时必须传入CHANNEL_IN_STEREO,否则缓冲区大小会不匹配立体声数据,导致录制异常。

2. 验证设备是否真的支持立体声输入

可以先做个小测试,检查设备支持的立体声参数:

int[] testSampleRates = new int[]{44100, 48000, 32000};
for (int rate : testSampleRates) {
    int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT);
    if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
        Log.d("StereoRecord", "设备支持采样率" + rate + "的立体声输入");
    }
}

如果所有采样率都返回ERROR_BAD_VALUE,那大概率是系统或硬件不支持立体声录制,可能需要联系设备厂商确认驱动配置。

3. 确认PCM数据拆分逻辑正确

对于16位立体声PCM,数据是按左声道-右声道-左声道-右声道的顺序排列的,正确的拆分代码应该是这样的:

// 假设rawData是读取到的原始PCM字节数组
short[] leftChannel = new short[rawData.length / 4];
short[] rightChannel = new short[rawData.length / 4];

for (int i = 0; i < rawData.length; i += 4) {
    // 左声道:合并第i和i+1字节为short
    leftChannel[i/4] = (short) ((rawData[i] & 0xFF) | (rawData[i+1] << 8));
    // 右声道:合并第i+2和i+3字节为short
    rightChannel[i/4] = (short) ((rawData[i+2] & 0xFF) | (rawData[i+3] << 8));
}

如果你的拆分逻辑是错误的(比如把同一组字节同时赋值给左右声道),也会导致结果一致,但从你的数据来看,更可能是录制阶段的问题。

4. 尝试更换音频源

有些设备的MIC音频源默认绑定单麦,你可以试试VOICE_COMMUNICATION这类专门的通信音频源,看是否能触发立体声录制:

int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;

额外调试小技巧

  • 找一段明确的立体声测试音频(比如左声道说话,右声道静音),用你的设备录制后检查原始PCM数据,这样能快速区分是录制问题还是拆分问题。
  • 查看Android TV的系统设置,有没有“强制单声道”这类选项,如果有,先关闭它再测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:45:59