【问题标题】:Using MediaRecorder and NoiseSuppressor in Android在 Android 中使用 MediaRecorder 和 NoiseSuppressor
【发布时间】:2013-10-31 21:50:39
【问题描述】:

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

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

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

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

 NoiseSuppressor create (int audioSession)

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

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

什么给了?

【问题讨论】:

    标签: android audio microphone mediarecorder noise


    【解决方案1】:

    来自 Android 开发者:

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

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

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

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

    因此您不能将Noise SuppressorMedia Recorder 一起使用。 但是,平台开发人员可以根据使用的MediaRecorder.AudioSource 在捕获路径中默认插入Noise Suppressor

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

    【讨论】:

      【解决方案2】:

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

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

      Android: Need to record mic input

      【讨论】:

        【解决方案3】:

        如果您想使用 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!");
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-28
          • 1970-01-01
          • 1970-01-01
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多