Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merging two or more .wav files in android

Tags:

android

First of all I must tell you that I am new to android. I want to combine two .wav (audio file) files. I have googled about it , it is easy to combine them using javax package but it is not supported on android. Can you tell me how to do this in android. Can you suggest me any tutorial or library that can help? Thanx in advance

like image 838
Harsh Avatar asked Jul 12 '12 13:07

Harsh


1 Answers

As a novice the user will just read bytes from the file and concat it with second file!!

But it doesnt work that way.You have to be very careful about wave file header while combining two file.fortunately i have ready snippet with me which will help you.

Here you go

private void CombineWaveFile(String file1, String file2) {
    FileInputStream in1 = null, in2 = 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 {
        in1 = new FileInputStream(file1);
        in2 = new FileInputStream(file2);

        out = new FileOutputStream(getFilename3());

        totalAudioLen = in1.getChannel().size() + in2.getChannel().size();
        totalDataLen = totalAudioLen + 36;

        WriteWaveFileHeader(out, totalAudioLen, totalDataLen,
        longSampleRate, channels, byteRate);

        while (in1.read(data) != -1) {

            out.write(data);

        }
        while (in2.read(data) != -1) {

            out.write(data);
        }

        out.close();
        in1.close();
        in2.close();

        Toast.makeText(this, "Done!!", Toast.LENGTH_LONG).show();
    } 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';
    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';
    header[13] = 'm';
    header[14] = 't';
    header[15] = ' ';
    header[16] = 16;
    header[17] = 0;
    header[18] = 0;
    header[19] = 0;
    header[20] = 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);
    header[33] = 0;
    header[34] = RECORDER_BPP;
    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);
}
like image 163
Vipul Avatar answered Oct 08 '22 05:10

Vipul