基本上,我的程序通過麥克風記錄用戶輸入並將其作爲.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();
}
但是,這使我的應用程序崩潰。我哪裏錯了?
其實我已經閱讀了開發音頻焦點文檔,我起初懷疑這是由於在音頻焦點損失。 在我的情況下,我從我的mp3文件中的InputStream流式傳輸音樂,然後將其輸出到OutputStream,最後輸出到.pcm文件中。用戶按下「開始流式傳輸」時的音樂流,並在用戶按下「停止流式處理」時停止播放。點擊開始播放後,稍後會發送.pcm文件進行播放。所以問題是,音頻焦點還能解決問題嗎? – Jeany
@Jean是的,你必須要求永久重點 –
好吧,我會試試看,讓你知道。非常感謝您的意見! :) – Jeany