Android Java:如何在传输系统音频时禁用麦克风输入?

基本上,我的程序通过麦克风录制用户输入,并将其作为.pcm文件存储在sdcard /目录中。 它会被覆盖,如果有现有的。 然后该文件被发送用于回放和分析(主要是FFT,RMS计算)。

我添加了另一个允许程序记录系统音频的功能,因此它还允许分析用户的mp3文件。 它流式传输系统音频并将其存储为.pcm文件供以后回放和分析。

这一切运作良好。 但是,当节目播放音频时,会出现一个小问题,它会捕获来自麦克风的输入,并且在播放过程中会出现噪音。 我不想要这个,因为它会影响分析阅读。 我搜索了一个解决方案,发现我实际上可以将麦克风静音。 所以现在,我想在mp3文件流式传输时将麦克风静音。

我发现的代码是,

AudioManager.setMicrophoneMute(真);

我试图实现它,但它只是崩溃我的应用程序。 这几天我试图寻找解决方案,但我似乎无法得到任何解决方案。

这是我的代码片段,用于在开始流式传输之前将流式传输系统音频和麦克风静音。

//创建一个新的AudioRecord对象来记录mp3文件的音频数据
int bufferSize = AudioRecord.getMinBufferSize(frequency,channelConfiguration,audioEncoding);

      audioRecord = new AudioRecord(AudioManager.STREAM_MUSIC, 
              frequency, channelConfiguration, 
              audioEncoding, bufferSize);

      //a short array to store raw pcm data
      short[] buffer = new short[bufferSize];   
      Log.i("decoder", "The audio record created fine ready to record");

      try {
          audioManager.setMicrophoneMute(true);
      } catch (Exception e) {
          e.printStackTrace();
      }


      audioRecord.startRecording();
      isDecoding = true;

当setMicrophoneMute(true)行被try-catch包围时,只有当我想发送录制的播放内容时,程序才会崩溃。 错误如下:
“AudioFlinger无法创建曲目,状态:-12”
“初始化AudioTrack时出错”
“[android.media.AudioTrack]初始化AudioTrack时的错误代码-20”。

当它没有被try-catch包围时,程序会在我点击开始流式传输按钮时崩溃。 “解码失败”<这是一个捕获一个throwable的错误日志。

如何在传输系统音频时将麦克风输入静音? 让我知道,如果我可以提供更多的代码。 谢谢!

**编辑我已经成功实现了我的mutemicrophone,它甚至还给我返回isMicrophoneMute()的一个true,但是,它没有被静音,因为它仍然从麦克风记录; 这是虚假的。

根据建议的答案,我已经创建了一个音频焦点类,如下所示:

private final Context c;

private final AudioManager.OnAudioFocusChangeListener changeListener =
    new AudioManager.OnAudioFocusChangeListener()
    {
        public void onAudioFocusChange(int focusChange)
        {
            //nothing to do
        }
    };


AudioFocus(Context context)
{
    c = context;
}


public void grabFocus()
{
    final AudioManager am = (AudioManager) c.getSystemService(Context.AUDIO_SERVICE);
    final int result = am.requestAudioFocus(changeListener,
                                            AudioManager.STREAM_MUSIC,
                                            AudioManager.AUDIOFOCUS_GAIN);
    Log.d("audiofocus","Grab audio focus: " + result);
}


public void releaseFocus()
{
    final AudioManager am = (AudioManager) c.getSystemService(Context.AUDIO_SERVICE);
    final int result = am.abandonAudioFocus(changeListener);
    Log.d("audiofocus","Abandon audio focus: " + result);
}

然后我从我的Decoder类中调用方法来请求音频焦点:

        int bufferSize = AudioRecord.getMinBufferSize(frequency, channelConfiguration,  audioEncoding);

        audioFocus.grabFocus();

        audioRecord = new AudioRecord(AudioManager.STREAM_MUSIC, 
                frequency, channelConfiguration, 
                audioEncoding, bufferSize);

        //a short array to store raw pcm data
        short[] buffer = new short[bufferSize];   
        Log.i("decoder", "The audio record created fine ready to record");


            audioRecord.startRecording();
            isDecoding = true;

            Log.i("decoder", "Start recording fine");

然后按下停止解码时释放焦点:

//stops recording
public void stopDecoding(){
    isDecoding = false;
    Log.i("decoder", "Out of recording");
    audioRecord.stop();

    try {
        dos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    mp.stop();
    mp.release();
    audioFocus.releaseFocus();
}

但是,这使我的应用程序崩溃。 我哪里错了?


以下片段要求音乐音频流上的永久音频焦点。 您应在开始播放之前立即请求音频焦点,例如用户按下播放时。 我认为这将是取代静音输入麦克风的方法。 查看开发者音频焦点文档以获取更多信息

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                                 // Use the music stream.
                                 AudioManager.STREAM_MUSIC,
                                 // Request permanent focus.
                                 AudioManager.AUDIOFOCUS_GAIN);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    am.registerMediaButtonEventReceiver(RemoteControlReceiver);
    // Start playback.
}
链接地址: http://www.djcxy.com/p/60181.html

上一篇: Android Java: how to disable microphone input while streaming system audio?

下一篇: InputSources actually good for?