4

i want to save recorder pcm data as aac/mp4 format file. i am using AudioRecord class for recording audio in android. i have success fully saved it as wave file by adding a wave header to raw data. but dont know how to save it as aac/mp4 file, because aac/mp4 format is compressed then wave. the methods i am using for saving pcm data as wave is pasted below.

recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            SavedSampleRate, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING,
            bufferSize);
recorder.startRecording();
isRecording = true;

isRecording = true;

recordingThread = new Thread(new Runnable() {
    @Override
    public void run() {
        writeAudioDataToFile();
    }
}, "AudioRecorder Thread");

recordingThread.start();

second

private void writeAudioDataToFile() {

    byte data[] = new byte[bufferSize];
    // short sData[] = new short[bufferSize];
    String filename = getTempFilename();
    FileOutputStream os = null;

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

    int read = 0;

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

            if (AudioRecord.ERROR_INVALID_OPERATION != read) {
                try {

                    synchronized (this) {


                        // Necessary in order to convert negative shorts!
                        final int USHORT_MASK = (1 << 16) - 1;

                        final ByteBuffer buf = ByteBuffer.wrap(data).order(
                                ByteOrder.LITTLE_ENDIAN);

                        final ByteBuffer newBuf = ByteBuffer.allocate(
                                data.length).order(ByteOrder.LITTLE_ENDIAN);

                        int sample;

                        while (buf.hasRemaining()) {



                            short shortSample = buf.getShort();
                            sample = (int) shortSample & USHORT_MASK;



                            sample = sample * db_value_global;
                            sample = mRmsFilterSetting.filter
                                    .apply((((int) 0) | shortSample)
                                            * db_value_global);



                            newBuf.putShort((short) sample);
                        }

                        data = newBuf.array();

                        os.write(data);





                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

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

and finally saving it as

private void copyWaveFile(ArrayList<String> inFilename, String outFilename) {
    FileInputStream[] in = null;
    FileOutputStream out = null;
    long totalAudioLen = 0;
    long totalDataLen = totalAudioLen + 36;
    long longSampleRate = SavedSampleRate;
    int channels = 2;
    long byteRate = RECORDER_BPP * SavedSampleRate * channels / 8;

    byte[] data = new byte[bufferSize];

    try {
        out = new FileOutputStream(outFilename);

        in = new FileInputStream[inFilename.size()];

        for (int i = 0; i < in.length; i++) {
            in[i] = new FileInputStream(inFilename.get(i));
            totalAudioLen += in[i].getChannel().size();
        }

        totalDataLen = totalAudioLen + 36;

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

        for (int i = 0; i < in.length; i++) {
            while (in[i].read(data) != -1) {
                out.write(data);
            }

            in[i].close();
        }

        out.close();
    } catch (Exception 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);
}

in this piece of code i am recording small PCM files with AudioRecord and saving them as wave file by adding wave header.

is there any step by step tutorial for how to save pcm data as mp4/aac file.

thanks in advance.

INVISIBLE
  • 41
  • 4

0 Answers0