实现android边说边播音频播放

通过audioRecord 录音、AudioTrack 播放
1、引入

    boolean isRecording = false;
    static final int freq = 8000;
    static final int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
    static final int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
    int recBuffSize =AudioRecord.getMinBufferSize(freq, channelConfiguration, audioEncoding);
    int playBufSize = AudioTrack.getMinBufferSize(freq, channelConfiguration, audioEncoding);
    AudioRecord audioRecord =new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, freq,
            AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, recBuffSize);
    //new AudioRecord(MediaRecorder.AudioSource.MIC, freq, channelConfiguration, audioEncoding, recBuffSize);
    AudioTrack audioTrack =new AudioTrack(AudioManager.STREAM_MUSIC, freq, channelConfiguration, audioEncoding, playBufSize, AudioTrack.MODE_STREAM);

第二

 class RecordPlayThread extends Thread {
        @Override
        public void run() {
            super.run();
            try {

                byte[] buffer = new byte[recBuffSize];
                audioRecord.startRecording(); // 开始录音
                //自动增强控制器
               /* if(AutomaticGainControl.isAvailable()){
                    automaticGainControl = AutomaticGainControl.create(audioRecord.getAudioSessionId());
                    automaticGainControl.setEnabled(true);
                }
                //消除噪音
                if(NoiseSuppressor.isAvailable()){
                    noiseSuppressor = NoiseSuppressor.create(audioRecord.getAudioSessionId());
                    noiseSuppressor.setEnabled(true);

                }
                //回音消除控制器
                if(AcousticEchoCanceler.isAvailable()){
                    acousticEchoCanceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId());
                    acousticEchoCanceler.setEnabled(true);
                }*/
                audioTrack.play(); // 开始放音
                while (isRecording) {
                    // 从MIC保存数据到buffer
                    int bufferReadResult = audioRecord.read(buffer, 0, recBuffSize);
                    byte[] tmpBuffer = new byte[bufferReadResult];
                    System.arraycopy(buffer, 0, tmpBuffer, 0, bufferReadResult);
                    // 写入数据到AudioTrack即可播放

                    audioTrack.write(tmpBuffer, 0, tmpBuffer.length);
                }
                audioRecord.stop();
                audioTrack.stop();

            } catch (Throwable t) {

            }
        }
    }

第三

 if (event.getAction() == MotionEvent.ACTION_DOWN) {
              isRecording = true;
               new RecordPlayThread().start();// 开线程边录边放
};
if (event.getAction() == MotionEvent.ACTION_UP) {
  isRecording = false;
  break;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值