我有一个名为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();
}
}
答案 0 :(得分:0)
来自“ acrCloudResult.getRecordDataPCM()”的PCM音频数据的格式为“ PCM 16位,单声道8000 Hz”,并且此音频数据缓冲区不包含“音频头”。
您可以将wav标头添加到PCM音频数据中,可以参考以下代码“ writeWaveFileHeader”,此步骤可以将PCM转换为WAV,并且可以使用音频播放器播放该wav文件。
writeWaveFileHeader(stream,data.length,data.length + 36,8000,1,2000);
您可以使用第三方库将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);
}