使用 ACRCloud 将录音保存在文件中
Save audio record in files with 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();
}
}
来自"acrCloudResult.getRecordDataPCM()"的PCM音频数据格式为"PCM 16 bit, mono 8000 Hz",此音频数据缓冲区不包含"Audio Header"。
你可以在PCM音频数据中加入一个wav头,可以参考下面的代码"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);
}
我有一个调用 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();
}
}
来自"acrCloudResult.getRecordDataPCM()"的PCM音频数据格式为"PCM 16 bit, mono 8000 Hz",此音频数据缓冲区不包含"Audio Header"。
你可以在PCM音频数据中加入一个wav头,可以参考下面的代码"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); }