Android(安卓)Audio Record
16lz
2021-01-26
1. 自定义录音类
package com.example.dyesebel; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException;import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream;import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.hardware.Camera.AutoFocusCallback; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioRecord; import android.media.AudioTrack; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MyAudioRecord { private File audioFile; private AudioRecord recorder = null; private int bufferSize = 0; private Thread recordingThread = null; private boolean isRecording = false; private static final int RECORDER_BPP = 16; private static final int RECORDER_SAMPLERATE = 11025; //11025; //8000; //11025; //44100; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO; private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; public void startRecording(){ bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE/*8000*//*11025*//*8000*/, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT); recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize); int i = recorder.getState(); if(i==1) recorder.startRecording(); isRecording = true; recordingThread = new Thread(new Runnable() { @Override public void run() { writeAudioDataToFile(); } },"AudioRecorder Thread"); recordingThread.start();}private void writeAudioDataToFile(){ byte data[] = new byte[bufferSize]; String filename = WelcomeActivity.MOBILE_MEMORY+"/dyesebelAudioRecordWav.pcm"; FileOutputStream os = null; try { os = new FileOutputStream(filename); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } int read = 0; if(null != os){ System.out.println("isRecording start"); while(isRecording){ //System.out.println("isRecording true"); read = recorder.read(data, 0, bufferSize); if(AudioRecord.ERROR_INVALID_OPERATION != read){ try { os.write(data); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("isRecording finish"); try { os.close(); } catch (IOException e) { e.printStackTrace(); } }}public void stopRecording(){isRecording = false;System.out.println("isRecording false"); if(null != recorder){ int i = recorder.getState(); if(i==1) recorder.stop(); recorder.release(); recorder = null; recordingThread = null; } copyWaveFile(WelcomeActivity.MOBILE_MEMORY+"/dyesebelAudioRecordWav.pcm",WelcomeActivity.MOBILE_MEMORY+"/dyesebelAudioRecordWav.wav"); } private void copyWaveFile(String inFilename,String outFilename){ FileInputStream in = null; FileOutputStream out = null; long totalAudioLen = 0; long totalDataLen = totalAudioLen + 36; long longSampleRate = RECORDER_SAMPLERATE; int channels = 2; long byteRate = RECORDER_BPP * RECORDER_SAMPLERATE * channels/8; byte[] data = new byte[bufferSize]; try { in = new FileInputStream(inFilename); out = new FileOutputStream(outFilename); totalAudioLen = in.getChannel().size(); totalDataLen = totalAudioLen + 36; // AppLog.logString("File size: " + totalDataLen); WriteWaveFileHeader(out, totalAudioLen, totalDataLen, longSampleRate, channels, byteRate); while(in.read(data) != -1){ out.write(data); } in.close(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }} private void WriteWaveFileHeader( FileOutputStream out, long totalAudioLen, long totalDataLen, long longSampleRate, int channels, long byteRate) throws IOException { byte[] header = new byte[44]; header[0] = 'R'; // RIFF/WAVE header header[1] = 'I'; header[2] = 'F'; header[3] = 'F'; header[4] = (byte) (totalDataLen & 0xff); header[5] = (byte) ((totalDataLen >> 8) & 0xff); header[6] = (byte) ((totalDataLen >> 16) & 0xff); header[7] = (byte) ((totalDataLen >> 24) & 0xff); header[8] = 'W'; header[9] = 'A'; header[10] = 'V'; header[11] = 'E'; header[12] = 'f'; // 'fmt ' chunk header[13] = 'm'; header[14] = 't'; header[15] = ' '; header[16] = 16; // 4 bytes: size of 'fmt ' chunk header[17] = 0; header[18] = 0; header[19] = 0; header[20] = 1; // format = 1 header[21] = 0; header[22] = (byte) channels; header[23] = 0; header[24] = (byte) (longSampleRate & 0xff); header[25] = (byte) ((longSampleRate >> 8) & 0xff); header[26] = (byte) ((longSampleRate >> 16) & 0xff); header[27] = (byte) ((longSampleRate >> 24) & 0xff); header[28] = (byte) (byteRate & 0xff); header[29] = (byte) ((byteRate >> 8) & 0xff); header[30] = (byte) ((byteRate >> 16) & 0xff); header[31] = (byte) ((byteRate >> 24) & 0xff); header[32] = (byte) (2 * 16 / 8); // block align header[33] = 0; header[34] = RECORDER_BPP; // bits per sample header[35] = 0; header[36] = 'd'; header[37] = 'a'; header[38] = 't'; header[39] = 'a'; header[40] = (byte) (totalAudioLen & 0xff); header[41] = (byte) ((totalAudioLen >> 8) & 0xff); header[42] = (byte) ((totalAudioLen >> 16) & 0xff); header[43] = (byte) ((totalAudioLen >> 24) & 0xff); out.write(header, 0, 44);} //merge...public void uniteWavFile(String[] partsPaths, String unitedFilePath) throws IOException { boolean select1=true;FileInputStream in1 = new FileInputStream(partsPaths[0]);long totalAudioLen1 = in1.getChannel().size(); FileInputStream in2 = new FileInputStream(partsPaths[1]);long totalAudioLen2 = in2.getChannel().size();FileOutputStream out = new FileOutputStream(unitedFilePath); if(totalAudioLen1 > totalAudioLen2) { select1 = false; } else { select1 = true; } bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE/*8000*//*11025*//*8000*/, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.ENCODING_PCM_16BIT); byte byte1[] = new byte[bufferSize];byte byte2[] = new byte[bufferSize];byte outbyte[] = new byte[bufferSize];if((in1.read(byte1) != -1)&& (in2.read(byte2) != -1)){ for(int i=0; i<44 ; i++){if(select1){outbyte[i] = (byte)byte1[i];}elseoutbyte[i] = (byte)byte2[i];}for(int i = 44;i<bufferSize; i++){outbyte[i] = (byte) ((byte1[i] + byte2[i]) >> 1);}out.write(outbyte);}elseSystem.out.println("uniteWavFilenew error!");if(select1){while(in1.read(byte1) != -1){in2.read(byte2);for(int i = 0;i<bufferSize; i++){outbyte[i] = (byte) ((byte1[i] + byte2[i]) >> 1);}out.write(outbyte); }}else{while(in2.read(byte2) != -1){in1.read(byte1);for(int i = 0;i<bufferSize; i++){outbyte[i] = (byte) ((byte1[i] + byte2[i]) >> 1);}out.write(outbyte); }}out.close();} }
2. 使用
a)start recordmMyAudioRecord.startRecording(); b)stop recordmMyAudioRecord.stopRecording();c)mergeString[] partsPaths = {"/sdcard/dyesebelAudioRecordWav.wav", "/sdcard/dyesebelinside.wav" }; mMyAudioRecord.uniteWavFile(partsPaths,"/sdcard/dyesebelAudioRecordnew.wav");
更多相关文章
- Android(安卓)Media Recorder录音播放源代码
- 电话录音录制双方的声音
- Android(安卓)获取 AudioRecord 麦克风音量大小并做选择性发送
- Android录音aac格式
- Android音频录制MediaRecorder之简易的录音软件
- Android(安卓)4.1 新增多媒体功能
- Android录音,拍照,摄像
- Android(安卓)Mp3格式录音,含有暂停,计时功能
- Android(安卓)Studio环境下开发百度语音REST语音识别功能