开发者

Android AudioData Append to End

I have the following code:

package com.android.AudioRecord_Player;
//imports
public class AudioRecord_Player extends Activity implements OnClickListener{

private static final int RECORDER_BPP = 16;
private static final String AUDIO_RECORDER_FILE_EXT_WAV = ".wav";
private static final String AUDIO_RECORDER_FOLDER = "AudioRecorder";
private static final String AUDIO_RECORDER_TEMP_FILE = "record_temp.raw";
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

//    private static final int AUDIO_SAMPLE_FREQ = 44100;
//    private static final int AUDIO_BUFFER_SIZE = 200000; 

private AudioRecord recorder = null;
private int bufferSize = 0;
private Thread recordingThread = null;
private boolean isRecording = false;

ImageButton start_record,pause_rec,stop_rec,play_rec,resume_rec;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(saved开发者_运维问答InstanceState);
    setContentView(R.layout.main);

    start_record=(ImageButton)findViewById(R.id.rec);
    pause_rec=(ImageButton)findViewById(R.id.pause);
    resume_rec=(ImageButton)findViewById(R.id.resume);
    stop_rec=(ImageButton)findViewById(R.id.stop);
    play_rec=(ImageButton)findViewById(R.id.play);

    pause_rec.setEnabled(false);
    stop_rec.setEnabled(false);
    play_rec.setEnabled(false);
    resume_rec.setEnabled(false);

    bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);

    start_record.setOnClickListener(this);
    pause_rec.setOnClickListener(this);
    stop_rec.setOnClickListener(this);
    play_rec.setOnClickListener(this);
    resume_rec.setOnClickListener(this);
 }

private String getFilename(){
    String filepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filepath,AUDIO_RECORDER_FOLDER);

    if(!file.exists()){
            file.mkdirs();
    }

    return (file.getAbsolutePath() + "/" + "Ravindra" + AUDIO_RECORDER_FILE_EXT_WAV);
 }

private String getTempFilename(){
    String filepath = Environment.getExternalStorageDirectory().getPath();
    File file = new File(filepath,AUDIO_RECORDER_FOLDER);

    if(!file.exists()){
            file.mkdirs();
    }

    File tempFile = new File(filepath,AUDIO_RECORDER_TEMP_FILE);

    if(tempFile.exists())
            tempFile.delete();

    return (file.getAbsolutePath() + "/" + AUDIO_RECORDER_TEMP_FILE);
 }

private void startRecording(){
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);

    //      recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
 //                AUDIO_SAMPLE_FREQ,
 //                AudioFormat.CHANNEL_CONFIGURATION_MONO,
 //                AudioFormat.ENCODING_PCM_16BIT,
 //                AUDIO_BUFFER_SIZE); 

    recorder.startRecording();

    isRecording = true;

    recordingThread = new Thread(new Runnable() {

            @Override
            public void run() {
                    writeAudioDataToFile();
            }
    },"AudioRecorder Thread");

    recordingThread.start();
 }

private void stopRecording(boolean b){
    if(recorder != null){
            isRecording = false;

            recorder.stop();
            recorder.release();

            recorder = null;
            recordingThread = null;
    }

    copyWaveFile(getTempFilename(),getFilename(),b);
    deleteTempFile();
 }

private void deleteTempFile() {
    File file = new File(getTempFilename());

    file.delete();
}
private void writeAudioDataToFile(){
    byte data[] = new byte[bufferSize];
    String filename = getTempFilename();
    FileOutputStream os = null;

    try {
            os = new FileOutputStream(filename);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    int read = 0;

    if(os != null){
            while(isRecording){
                    read = recorder.read(data, 0, bufferSize);

                    if(AudioRecord.ERROR_INVALID_OPERATION != read){
                            try {
                                    os.write(data);
                            } catch (IOException e) {
                                    e.printStackTrace();
                            }
                    }
            }

            try {
                    os.close();
            } catch (IOException e) {
                    e.printStackTrace();
            }
    }
  }  

private void copyWaveFile(String inFilename,String outFilename, boolean b){
    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,b);
            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);
 }

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v==start_record)
    {
      Toast.makeText(AudioRecord_Player.this, "Now Recording...", Toast.LENGTH_LONG).show();
      startRecording();
      start_record.setEnabled(false);
      pause_rec.setEnabled(true);
      stop_rec.setEnabled(true);

    }
    else if(v==stop_rec)
    {
      Toast.makeText(AudioRecord_Player.this, "Recording Stopped...",    Toast.LENGTH_LONG).show();
      stopRecording(true);
      start_record.setEnabled(true);
      stop_rec.setEnabled(false);
      pause_rec.setEnabled(false);

    }
}    
 }

I want to append the new Recording to Ravindra.wav. I tried FileOutputStream with the true option but it is not working fine.

Where am i going wrong here?


I found an answer for this problem, Basically in order to append the audio Data, you have to change the header of the audio file then change the data.

Actual code which worked for me is:

http://www.pastie.org/2165869

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜