Android平台 音频录制播放主要方式有两个: AudioRecord 和 MediaRecord.
AudioRecord 是更底层的类, 能够实现边录边播, 通过(AudioRecord 和 AudioTrack组合实现汤姆猫应用等)输出的是pcm语音数据,需要自己实现数据转码才能够播放。
MediaRecord 主要是 用来录像的,是更偏向于应用层的类。集成了录音 编码 压缩,只支持少量的录音音频格式,如3gp amr acc等
AudioRecord 是将采集到的 指定声音采样数据的 信息记录在一个相关联的buffer中, 我们可以对裸数据进行操作
// 获得缓冲区字节大小
// 采样频率
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道 // 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。 int bufferSizeInBytes = AudioRecord.getMinBufferSize(AudioFileFunc.AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); // 创建AudioRecord对象 第一个参数:音频获取源 AudioRecord audioRecord = new AudioRecord(AudioFileFunc.AUDIO_INPUT, AudioFileFunc.AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes); try { audioRecord.startRecording(); } catch (IllegalStateException e) { e.printStackTrace(); } new Thread(new AudioRecordThread()).start(); // 开启数据写入线程 class AudioRecordThread implements Runnable { @Override public void run() { writeDateToFile();//往文件中写入数据 listener.onSpeechOver(0); } } private static void writeDateTOFile() { // new一个byte数组用来存一些字节数据,大小为缓冲区大小 final byte[] audiodata = new byte[bufferSizeInBytes]; FileOutputStream fos = null; try { File file = new File(currentFilePath); if (file.exists()) { file.delete(); } file.createNewFile(); fos = new FileOutputStream(file);// 建立一个可存取字节的文件 } catch (Exception e) { e.printStackTrace(); } while (mIsRecording == true) { final int size = audioRecord.read(audiodata, 0, bufferSizeInBytes); if (AudioRecord.ERROR_INVALID_OPERATION != size) { try { fos.write(audiodata); calculateVolume(audiodata, 0, size); } catch (IOException e) { e.printStackTrace(); } } } try { fos.close();// 关闭写入流 } catch (IOException e) { e.printStackTrace(); } } private void close() { if (audioRecord != null) { mIsRecording = false;//停止文件写入 try { audioRecord.stop(); audioRecord.release();//释放资源 } catch (Exception e) { e.printStackTrace(); } audioRecord = null; } }
MediaRecord:直接指定输出文件 中间过程进行程序介入不太方便。
MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(OUTPUT_FILENAME); recorder.prepare(); recorder.start(); ... recorder.stop(); recorder.release();
// reset 之后相当于整个record重新构造
recorder.reset();