3

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

    mRecorder = new MediaRecorder();
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mRecorder.setOutputFile(mFileName);
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

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

麻烦的是,我正在尝试添加一些音频处理效果,例如 NoiseSuppressor。API 文档声明 NoiseSuppressor 是通过以下方式完成的:

 NoiseSuppressor create (int audioSession)

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

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

是什么赋予了?

4

3 回答 3

5

来自 Android 开发者:

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

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

val suppressor = NoiseSuppressor.create(
            recorder!!.audioSessionId)

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

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

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

于 2019-06-04T22:53:27.930 回答
0

我发现答案是 MediaRecorder 根本不适合我的处理类型。我正在寻找捕捉麦克风音频并实时播放。更好的解决方案是使用 AudioTrack 和 AudioRecord。

这个主题很好地讨论了它:

Android:需要记录麦克风输入

于 2013-10-23T17:41:07.847 回答
0

如果你想使用 NoiseSuppressor,那么你必须使用 AudioManager 和 MediaRecorder。对于噪声抑制,请使用以下代码:

// 以下仅对 Jelly Bean 及更高版本生效。

 audioManager.setMode(AudioManager.MODE_IN_CALL);
    audioManager.setParameters("noise_suppression=on");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    Log.i("Trying to clean up audio because running on SDK " + Build.VERSION.SDK_INT);

    if (noise && NoiseSuppressor.create(getAudioSessionId()) == null) {
        Log.i("NoiseSuppressor not present :(");
    } else {
        Log.i("NoiseSuppressor enabled!");
    }

    if (gain && AutomaticGainControl.create(getAudioSessionId()) == null) {
        Log.i("AutomaticGainControl not present :(");
    } else {
        Log.i("AutomaticGainControl enabled!");
    }

    if (echo && AcousticEchoCanceler.create(getAudioSessionId()) == null) {
        Log.i("AcousticEchoCanceler not present :(");
    } else {
        Log.i("AcousticEchoCanceler enabled!");
    }
}
于 2016-03-18T05:49:13.767 回答