1

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 上尝试过此代码

4

1 回答 1

1

我已经解决了以下问题:为什么我的 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 stable

于 2021-01-22T06:42:56.967 回答