在 Android 中使用 MediaRecorder 和 NoiseSuppressor

Rae*_*vik 3 audio android microphone noise mediarecorder

我正在开始一个项目,使用如下代码试验 Android 麦克风:

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mRecorder.setOutputFile(mFileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Run Code Online (Sandbox Code Playgroud)

之后,准备()和开始()开始录制麦克风音频。

问题是,我还尝试添加一些音频处理效果,例如 NoiseSuppressor。API 文档声明 NoiseSuppressor 是这样完成的:

 NoiseSuppressor create (int audioSession)
Run Code Online (Sandbox Code Playgroud)

初始化录制流并获取该流的 audioSession 的适当方法是什么?我很惊讶地发现我无法从 mediaRecorder 获取 audioSession。

为什么存在两种设置音频流的方法?我看到了 AudioRecord 方法,但是 API 文档建议首选上述方法。

是什么赋予了?

Hit*_*ahu 5

来自安卓开发者:

要将 NoiseSuppressor 附加到特定的 AudioRecord,请在创建 NoiseSuppressor 时指定此 AudioRecord 的音频会话 ID。通过在 AudioRecord 实例上调用 AudioRecord.getAudioSessionId() 来检索音频会话。

这意味着NoiseSuppressor需要audioSessionId像这样创建噪声抑制器实例

val suppressor = NoiseSuppressor.create(
            recorder!!.audioSessionId)
Run Code Online (Sandbox Code Playgroud)

如果您查看getaudiosessionid 参考资料,您将看到音频会话只能由Media PlayerAudio Recorder创建。

因此,您不能Noise SuppressorMedia Recorder. 但是Noise Suppressor可以由平台开发者根据MediaRecorder.AudioSource使用情况默认插入到捕获路径中。

无论如何,如果您仍然想尝试 Audio Recorder,那么我会说我已经尝试在Audio Recorder 中启用 NS 并且当我调用NoiseSuppressor.isAvailable()它时总是返回false