To convert byte array to mp3 file

I have written an application in android to record voice from mic and store it in byte array using

audioRecord.read(bigBuff, currSize, minBuffSize);

bigBuff is an byte array now i want to convert this byte array into .mp3 file or .wav file I am doing this as

File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/aaa.wav");

f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
fos.write(bigBuff);
fos.flush();
fos.close();

aaa.wav file is getting created successfully but when I am trying to play it from outside the app like any other .wav or .mp3 file its showing error "sorry Player does not support this type of audio file"

please help.

Answers


I think you don't input data header. add this mothod and after copy data.

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

To configure header refer to following links

https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

http://www.topherlee.com/software/pcm-tut-wavformat.html

Above header do not work for me but after making minor changes in configuration its working perfectly.


Need Your Help

Java command lastModified() not working in Clojure

java file clojure io openjdk

I am trying to get the last modified time from a file in Clojure, by executing a Java command.

Creating an IPA, "contains multiple products"

iphone ios xcode xcode4 mailcore

I am working on an email client based on ReMail. Basically, I reused the ReMail project so that the MailCore etc dependencies would be all set up out of the box so I could build a new app on top o...