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

时间:2018-08-04 10:55:23

标签: java android 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();
        }
    }

1 个答案:

答案 0 :(得分:0)

来自“ acrCloudResult.getRecordDataPCM()”的PCM音频数据的格式为“ PCM 16位,单声道8000 Hz”,并且此音频数据缓冲区不包含“音频头”。


  1. 您可以将wav标头添加到PCM音频数据中,可以参考以下代码“ writeWaveFileHeader”,此步骤可以将PCM转换为WAV,并且可以使用音频播放器播放该wav文件。

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

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

相关问题