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");






更多相关文章

  1. Android(安卓)Media Recorder录音播放源代码
  2. 电话录音录制双方的声音
  3. Android(安卓)获取 AudioRecord 麦克风音量大小并做选择性发送
  4. Android录音aac格式
  5. Android音频录制MediaRecorder之简易的录音软件
  6. Android(安卓)4.1 新增多媒体功能
  7. Android录音,拍照,摄像
  8. Android(安卓)Mp3格式录音,含有暂停,计时功能
  9. Android(安卓)Studio环境下开发百度语音REST语音识别功能

随机推荐

  1. Android(安卓)Manager之MediaRecorder(音
  2. 游戏音频-详解MediaPlayer,SoundPool利弊
  3. shareSdk错误码对照表
  4. (Android(安卓)) wrapper was not proper
  5. Android自屏幕底部滑出更多面板的实现
  6. Bluetooth---如何使用Android蓝牙开发
  7. aapt.AaptException Failed to crunch fi
  8. Android(安卓)TextView部分文字实现点击
  9. Android(安卓)MediaPlayer 播放本地与远
  10. android 文件的认识