Сохраните аудиозапись в файлах с помощью 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 Гц", и этот буфер аудиоданных не включает "Заголовок аудио".
Вы можете добавить WAV-заголовок в аудиоданные PCM, можете обратиться к следующему коду "writeWaveFileHeader", этот шаг может преобразовать PCM в WAV, и вы можете воспроизвести этот файл WAV с помощью аудиоплеера.
writeWaveFileHeader (поток, data.length, data.length+36, 8000, 1, 2000);
Вы можете использовать стороннюю библиотеку для преобразования 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); }