问题描述
Android 版本:10 Android 设备:OnePlus 6
我尝试使用来自 AudioManager 的 sessionID 来应用 Java AudioEffect 并从这个 LINK 获得帮助,但在使用 AcousticEchoCanceler.create(sessionId) 时我总是得到空指针异常;但是当我传递 Java AudioRecord getAudioSessionId() 的 sessionId 时,它可以工作。
我的代码是:
val audioManager: AudioManager = context.getSystemService(Context.AUdio_SERVICE) as AudioManager
val sessionId = audioManager.generateAudioSessionId()
C 代码是
recordingBuilder.setSessionId(static_cast<oboe::SessionId>(sessionId));
oboe::Result recordStreamResult = recordingBuilder.openStream(&recordStream);
我已经在 OnePlus 6 和 Motorola one Macro 上试过这个代码
解决方法
我已经解决了以下问题:为什么我的 AcousticEchoCanceler.create(sessionId) 返回 null,即使它可用。
这是代码
val audioManager: AudioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
val sessionId = audioManager.generateAudioSessionId()
//This is the line that enables AEC,when MODE is set
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
当模式明确设置为 MODE_IN_COMMUNICATION 时,AcousticEchoCancelation 开始工作。您可以在此处启用或禁用它。
val isAecAvailable = AcousticEchoCanceler.isAvailable()
val acousticEchoCanceler = AcousticEchoCanceler.create(sessionId)
acousticEchoCanceler.enabled = true //THIS ENABLED THE AEC
if (acousticEchoCanceler != null)
Log.e(TAG,"AEC STATUS: ${acousticEchoCanceler.enabled}")
else
Log.e(TAG,"AEC IS NULL")
目前,我使用的是双簧管版本:1.5 稳定版