Сохраните аудиозапись в файлах с помощью ACRCloud

У меня проблема с приложением для Android, которое вызывает ACRCloud. Для работы, которую мне нужно сделать, я хочу сохранить запись в файл 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 ответ

Решение

Формат аудиоданных PCM из "acrCloudResult.getRecordDataPCM()" равен "16-битный PCM, моно 8000 Гц", и этот буфер аудиоданных не включает "Заголовок аудио".


  1. Вы можете добавить WAV-заголовок в аудиоданные PCM, можете обратиться к следующему коду "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);
            }

Другие вопросы по тегам