android麦克风音频,android – 实时播放麦克风中的音频

这对我有用:

boolean isRecording = false;

AudioManager am = null;

AudioRecord record = null;

AudioTrack track = null;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setVolumeControlStream(AudioManager.MODE_IN_COMMUNICATION);

initRecordAndTrack();

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

am.setSpeakerphoneOn(true);

(new Thread()

{

@Override

public void run()

{

recordAndPlay();

}

}).start();

Button startButton = (Button) findViewById(R.id.start_button);

startButton.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

if (!isRecording)

{

startRecordAndPlay();

}

}

});

Button stopButton = (Button) findViewById(R.id.stop_button);

stopButton.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

if (isRecording)

{

stopRecordAndPlay();

}

}

});

}

private void initRecordAndTrack()

{

int min = AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);

record = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,

min);

if (AcousticEchoCanceler.isAvailable())

{

AcousticEchoCanceler echoCancler = AcousticEchoCanceler.create(record.getAudioSessionId());

echoCancler.setEnabled(true);

}

int maxJitter = AudioTrack.getMinBufferSize(8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT);

track = new AudioTrack(AudioManager.MODE_IN_COMMUNICATION, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, maxJitter,

AudioTrack.MODE_STREAM);

}

private void recordAndPlay()

{

short[] lin = new short[1024];

int num = 0;

am.setMode(AudioManager.MODE_IN_COMMUNICATION);

while (true)

{

if (isRecording)

{

num = record.read(lin, 0, 1024);

track.write(lin, 0, num);

}

}

}

private void startRecordAndPlay()

{

record.startRecording();

track.play();

isRecording = true;

}

private void stopRecordAndPlay()

{

record.stop();

track.pause();

isRecording = false;

}

您还需要在activity_main布局中使用id为start_button和stop_button的两个按钮.

此示例还包含一个EchoCanceler!

祝好运!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值