首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >三星设备上的AcousticEchoCanceler无法工作

三星设备上的AcousticEchoCanceler无法工作
EN

Stack Overflow用户
提问于 2017-10-04 08:56:31
回答 3查看 2.4K关注 0票数 13

我让AcousticEchoCanceler为我尝试过的所有其他设备类型的VoIP调用服务,但在任何三星设备上都没有。该设备报告AcousticEchoCanceler可用,但它什么也不做。

我得到的是:

  • acousticEchoCanceler.setEnabled(true);
  • audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
  • 传递给AudioTrack的音频会话ID
  • 抽样率:16 000
  • 试过单声道和立体声录音
  • <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  • <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

有人让AcousticEchoCanceler在三星设备上工作吗?

EN

回答 3

Stack Overflow用户

发布于 2017-12-08 08:22:28

我最近也有同样的问题。对我来说,最重要的部分是在创建audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION)之前使用AudioRecord。

接下来,用以下内容创建AudioRecord:

代码语言:javascript
运行
复制
mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, mSamplingRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, audioRecordBufferSize);

最后创建并启用NS和AEC:

代码语言:javascript
运行
复制
mNoiseSuppressor = NoiseSuppressor.create(mAudioRecord.getAudioSessionId());
if (mNoiseSuppressor != null) {
    int res = mNoiseSuppressor.setEnabled(true);
}

mAcousticEchoCanceler = AcousticEchoCanceler.create(mAudioRecord.getAudioSessionId());
if (mAcousticEchoCanceler != null) {
    int res = mAcousticEchoCanceler.setEnabled(true);
}

AudioTrack不需要与AudioTrack相关联到相同的音频会话ID (我认为应该自动完成)。

票数 9
EN

Stack Overflow用户

发布于 2017-10-12 04:51:13

几年前,我试过这段代码,并记住它是有效的。不能说它将如何与最新的设备。

代码语言:javascript
运行
复制
int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
int sampleFreq = 16000;
int numChannels = 1;
int numBytesPerSample = 2;
int channelConfig = numChannels == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO;
int audioFormat = numBytesPerSample == 2 ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
int bufSize = AudioRecord.getMinBufferSize(sampleFreq, channelConfig, audioFormat);
if (bufSize == AudioRecord.ERROR_BAD_VALUE || bufSize == AudioRecord.ERROR) {
        return;
}

AudioRecord audioInRecord   = new AudioRecord(audioSource, sampleFreq, 
                channelConfig, audioFormat, bufSize);
if (audioInRecord.getState() != AudioRecord.STATE_INITIALIZED) {
    return;
}

boolean aecAvailable = AcousticEchoCanceler.isAvailable();
if (aecAvailable) {
    AcousticEchoCanceler instance;
    if((instance = AcousticEchoCanceler.create(audioInRecord.getAudioSessionId())) != null) {
        instance.setEnabled(true);
        Log.d(TAG, "AEC enabled");
    } else {
        Log.d(TAG, "AEC disabled");
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-10-09 04:41:54

试试以下几行:

代码语言:javascript
运行
复制
if (AcousticEchoCanceler.isAvailable() && WebRtcAudioUtils.isAcousticEchoCancelerSupported()) {
                WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
                WebRtcAudioUtils.useWebRtcBasedAcousticEchoCanceler();
            }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46560814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档