0

I know this question is discussed already but after googled a lot I cant able to find the solution why two .wav merged file is not playable?I am merging two .wav file into one file.But the merged file is being played for just a second.Nothing else.After Click on play button it plays for a second.Please give me suggestion or check my code to identify the problem.Thanks in advance.The code I am using two merge two files is as below:

    private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_BPP = 16;
private void CombineWaveFile(String file1, String file2, String path) {
    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[8192];

    try {
        in1 = new FileInputStream(file1);
        in2 = new FileInputStream(file2);
        File file_path = new File(path);
        file_path.setReadable(true);
        out = new FileOutputStream(file_path);

        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();
        Log.e("mPAthTemp Combine", file_path.toString());
        Log.e("mFileSecond Combine", file2);

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

}

Code I am using to play the audio file is as below:

private void startPlaying(String file_path) {
    mPlayer = new MediaPlayer();
    try {
        Log.e("playing", file_path);
        mPlayer.setDataSource(file_path);
        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mPlayer.prepare();

        mPlayer.start();
        mPlayer.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                showToast("Complete");
                setProgressBar(false);
                mButtonStart.setEnabled(true);
                mButtonStop.setEnabled(false);
                stopPlaying();
            }
        });

    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

Give me a solution why this happen.Thanks..

AndiM
  • 2,196
  • 2
  • 21
  • 38

1 Answers1

0

I don't know what specifically causes your specific problem, but this code is littered with bugs, some combination of which might explain your problem. Here's what I spotted by inspection:

  • It assumes that the incoming files are the same format (16 bit stereo, 44100, etc) without checking.
  • It doesn't parse the incoming files at all. Thus it treats the headers of the incoming files as audio data and appends that to the outgoing file (yikes!). This is especially strange considering it carefully writes a header for the output file.
  • It doesn't check the return value of read(), thus writing larger blocks than it reads in some cases (especially the last block of each incoming file).

Perhaps you need some new sample code. JSResources might be a good place to start.

Bjorn Roche
  • 11,279
  • 6
  • 36
  • 58