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?