有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用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) 个答案

  1. # 1 楼答案

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


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

      writeWaveFileHeader(stream,data.length,data.length+368000,12000)

    2. 您可以使用第三方库将PCM/WAV转换为MP3。例如:Lame,您可以引用此代码https://github.com/Jay-Goo/Mp3Converter

      &13; 第13部分,;
          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);
              }
      和#13;
    和#13;