使用 ACRCloud 将录音保存在文件中

Save audio record in files with ACRCloud

我有一个调用 ACRCloud 的 Android 应用程序有问题。 由于我需要做的工作,我想把录音保存成MP3文件,但不知道为什么不行。

这是我的代码:

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

来自"acrCloudResult.getRecordDataPCM()"的PCM音频数据格式为"PCM 16 bit, mono 8000 Hz",此音频数据缓冲区不包含"Audio Header"。


  1. 你可以在PCM音频数据中加入一个wav头,可以参考下面的代码"writeWaveFileHeader",这一步可以将PCM转为WAV,你可以播放这个带有音频的wav文件播放器。

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

  2. 您可以使用第三方库将PCM/WAV转换为MP3。例如:Lame,你可以参考这段代码,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);
            }