2014-07-08 48 views
0

基本上,我的程序通過麥克風記錄用戶輸入並將其作爲.pcm文件存儲在sdcard /目錄中。它會被覆蓋,如果有現有的。然後該文件被髮送用於回放和分析(主要是FFT,RMS計算)。Android Java:如何在傳輸系統音頻時禁用麥克風輸入?

我添加了另一個功能,它允許程序記錄系統音頻,因此它還允許分析用戶的mp3文件。它流式傳輸系統音頻並將其存儲爲.pcm文件供以後回放和分析。

這一切運作良好。但是,當節目播放音頻時,會出現一個小問題,它會捕獲來自麥克風的輸入,並且在播放過程中會出現噪音。我不想要這個,因爲它會影響分析閱讀。我搜索了一個解決方案,發現我實際上可以將麥克風靜音。所以現在,我想在mp3文件流式傳輸時將麥克風靜音。

我發現的代碼,

AudioManager.setMicrophoneMute(真);

我試圖實現它,但它只是崩潰我的應用程序。這幾天我試圖尋找解決方案,但我似乎無法得到任何解決方案。

這是我的代碼片段,我想要在開始流式傳輸之前將流式系統音頻和麥克風靜音。

//創建一個新對象AudioRecord記錄一個MP3文件的音頻數據
INT BUFFERSIZE = AudioRecord.getMinBufferSize(頻率,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(真)線與的try-catch包圍,該計劃將只有當我想爲送戲錄製回崩潰。錯誤如下:
「AudioFlinger無法創建跟蹤,狀態:-12」
「錯誤初始化AudioTrack」
「[android.media.AudioTrack]錯誤代碼-20初始化AudioTrack時。」

當它沒有被try-catch包圍時,程序只會在我點擊開始流式傳輸按鈕時崩潰。 「解碼失敗」<這是一個捕獲一個throwable的錯誤日誌。

如何在傳輸系統音頻時將麥克風輸入靜音?讓我知道,如果我可以提供更多的代碼。謝謝!

**編輯 我已經成功地實現我的mutemicrophone,它甚至返回我要isMicrophoneMute(),但是,這不是靜音,因爲它仍然從麥克風記錄一個真實的;這是虛假的。

根據建議的答案,我已經創建瞭如下音頻焦點類:

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

以下片段要求音樂音頻流上的永久音頻焦點。您應在開始播放之前立即請求音頻焦點,例如用戶按下播放時。我認爲這將是取代靜音輸入麥克風的方法。退房的開發商audio focus文檔的更多信息

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

其實我已經閱讀了開發音頻焦點文檔,我起初懷疑這是由於在音頻焦點損失。 在我的情況下,我從我的mp3文件中的InputStream流式傳輸音樂,然後將其輸出到OutputStream,最後輸出到.pcm文件中。用戶按下「開始流式傳輸」時的音樂流,並在用戶按下「停止流式處理」時停止播放。點擊開始播放後,稍後會發送.pcm文件進行播放。所以問題是,音頻焦點還能解決問題嗎? – Jeany

+0

@Jean是的,你必須要求永久重點 –

+0

好吧,我會試試看,讓你知道。非常感謝您的意見! :) – Jeany