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

如何使用ExoPlayer播放音频且避免AudioRecord采集到播放内容

解决AudioRecord与ExoPlayer同时使用时的回声采集问题

以下是几个可落地的解决方案,按优先级排序:

1. 启用系统级回声消除(AEC)

Android系统针对通话场景内置了回声消除机制,这是最省心的方案,优先尝试:

配置音频路由与模式

将音频模式切换到通话模式,系统会自动启用AEC、降噪等通话相关处理:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// 设置为通话模式,触发系统AEC
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
// 开启扬声器(如果需要免提播放)
audioManager.setSpeakerphoneOn(true);

配置AudioRecord的音频源

使用专为通话优化的音频源,确保系统AEC能作用于录制流程:

// 初始化AudioRecord时,选择VOICE_COMMUNICATION音频源
int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
int sampleRate = 44100;
int channelConfig = AudioFormat.CHANNEL_IN_MONO;
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);

AudioRecord audioRecord = new AudioRecord(audioSource, sampleRate, channelConfig, audioFormat, bufferSize);

配置ExoPlayer的音频属性

让ExoPlayer的播放纳入通话音频链路,确保系统AEC能捕获播放音频作为参考:

AudioAttributes audioAttributes = new AudioAttributes.Builder()
    .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
    .build();
player.setAudioAttributes(audioAttributes, true);

2. 软件级回声消除(当系统AEC效果不佳时)

如果部分设备系统AEC支持不好,可以集成WebRTC的回声消除模块:

  • 引入WebRTC的音频处理库(比如通过aar依赖)
  • 在录制流程中,将AudioRecord采集的原始PCM数据和ExoPlayer播放的PCM数据(作为参考输入)传入WebRTC的AEC模块处理,再保存处理后的音频数据
  • 注意保持录制和播放的采样率、声道数一致,否则AEC效果会大打折扣

3. 硬件层面的辅助优化

  • 尽量使用设备的主麦克风(避免使用靠近扬声器的副麦)
  • 如果是定制设备,可以调整麦克风的拾音指向性,减少对扬声器声音的采集

内容的提问来源于stack exchange,提问作者Khánh duy Lê

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:24:58