-1

I have a problem with a Android app that call ACRCloud. For the work that I need to do, I want to save the recording in a MP3 file but I don't know why it doesn't work.

That's my code :

    File f = null;
    try {
        f = createAudioFile();
    } catch (IOException e) {
        e.printStackTrace();
    }

    byte[] data = acrCloudResult.getRecordDataPCM();

    if(f.exists()){
        String path = f.getPath();
        FileOutputStream stream = null;
        try {
            stream = new FileOutputStream(path);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            stream.write(data);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1 Answers1

0

The format of PCM audio data from "acrCloudResult.getRecordDataPCM()" is "PCM 16 bit, mono 8000 Hz", and this audio data buffer do not include "Audio Header".


  1. You can add a wav header into PCM audio data, can refer to the following code "writeWaveFileHeader", this step can convert PCM to WAV, and you can play this wav file with audio player.

    writeWaveFileHeader(stream, data.length, data.length+36, 8000, 1, 2000);

  2. You can use a third-party library to convert PCM/WAV to MP3. For Example: Lame, and you can refer to this code, https://github.com/Jay-Goo/Mp3Converter.

        void writeWaveFileHeader(FileOutputStream out, long totalAudioLen, long totalDataLen, int sampleRate, int channels, long byteRate) throws IOException {
                byte[] header = new byte[44];
                header[0] = 'R'; // RIFF
                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'; //WAVE
                header[9] = 'A';
                header[10] = 'V';
                header[11] = 'E';
                //FMT Chunk
                header[12] = 'f'; // 'fmt '
                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)(sampleRate & 0xff);
                header[25] = (byte)((sampleRate >> 8) & 0xff);
                header[26] = (byte)((sampleRate >> 16) & 0xff);
                header[27] = (byte)((sampleRate >> 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)(channels * 16 / 8);
                header[33] = 0;
            
                header[34] = 16;
                header[35] = 0;
                //Data chunk
                header[36] = 'd'; //data
                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);
            }
Tony Li
  • 95
  • 5