2014-07-08 1 views
0

기본적으로 내 프로그램은 마이크를 통해 사용자 입력을 기록하고 sdcard/디렉토리에 .pcm 파일로 저장합니다. 기존 파일이 있으면 덮어 씁니다. 파일은 나중에 재생 및 분석 (주로 FFT, RMS 계산)을 위해 전송됩니다.Android Java : 시스템 오디오를 스트리밍하는 동안 마이크 입력을 비활성화하는 방법?

나는 프로그램이 시스템 오디오를 녹음 할 수있게 해주는 또 다른 기능을 추가 했으므로 사용자의 mp3 파일도 분석 할 수 있습니다. 시스템 오디오를 스트리밍하여 나중에 재생 및 분석 할 수 있도록 .pcm 파일로 저장합니다.

모두 잘 작동합니다. 그러나 약간의 문제가 있습니다. 프로그램에서 오디오를 스트리밍하면 마이크에서 입력을 캡처하여 재생시 노이즈가 발생합니다. 나는 이것이 분석 읽기에 영향을 미치기 때문에 이것을 원하지 않습니다. 나는 해결책을 찾아 봤는데 실제로 마이크를 음소거 할 수 있다는 것을 알았다. 이제 mp3 파일을 스트리밍 할 때 마이크를 음소거하고 싶습니다.

내가 찾은 코드는

,

AudioManager.setMicrophoneMute (TRUE);

구현을 시도했지만 응용 프로그램이 손상되었습니다. 나는이 며칠 동안 해결책을 찾으려고했지만 아무 것도 얻을 수없는 것 같습니다.

다음은 스트리밍을 시작하기 전에 시스템 오디오를 스트리밍하고 마이크를 음소거하려는 부분에 대한 코드 조각입니다.

// MP3 파일의 오디오 데이터를 기록 할 수있는 새로운 가지 audiorecord 객체를 생성
INT 버퍼 크기 = AudioRecord.getMinBufferSize (주파수 channelConfiguration, audioEncoding); setMicrophoneMute (참) 라인 시도 - 캐치로 둘러싸여 언제 다시 플레이에 대한 레코드를 보낼 때

 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; 

는 프로그램은 충돌 것입니다.
"AudioFlinger 트랙을 만들 수 없습니다, 상태 : -12"이 오류는 다음과 같습니다. "[android.media.AudioTrack] 오류 코드 -20이 AudioTrack 초기화"
는 "오류가 AudioTrack 초기화"

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); 
} 

:

 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(); 
} 

그러나, 내 응용 프로그램이 충돌합니다. 나는 어디로 잘못 갔는가?

답변

0

다음 발췌 문장은 음악 오디오 스트림에 영구적 인 오디오 포커스를 요구합니다. 사용자가 재생을 누를 때와 같이 재생을 시작하기 직전에 오디오 포커스를 요청해야합니다. 이것이 입력 마이크를 음소거하는 것보다 오히려 갈 방법이라고 생각합니다. 자세한 내용은 실제로 개발자 오디오 초점 문서를 읽고, 나는 처음에이 오디오 사용의 손실 때문이 의심되는

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. 
} 
+0

에 대한 개발자 audio focus 문서를 확인하십시오. 필자의 경우, mp3 파일의 InputStream에서 음악을 스트리밍 한 다음 OutputStream에 출력하고 마지막으로 .pcm 파일로 출력합니다. 사용자가 스트리밍 시작을 누를 때부터 음악 스트리밍이 시작되고 사용자가 스트리밍 중지를 누르면 중지됩니다. 나중에 재생 시작을 클릭하면 .pcm 파일이 재생을 위해 전송됩니다. 문제는 오디오 포커스가 여전히 문제를 해결합니까? – Jeany

+0

@Jean 예 영구 초점을 요청해야합니다. –

+0

알겠습니다. 시도해보고 알려 드리겠습니다. 귀하의 의견을 보내 주셔서 감사합니다. :) – Jeany

관련 문제