Merging two or more .wav files in android

前端 未结 1 1812
[愿得一人]
[愿得一人] 2020-12-04 20:53

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 packag

相关标签:
1条回答
  • 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);
    }
    
    0 讨论(0)
提交回复
热议问题