WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,经过了多次修订,可用于Windows,Macintosh,Linix等多种操作系统
那么如果有需求需要向为每一个wav文件添加附加信息,我们需要怎么做呢?
首先看一下wav头文件的具体组成部分:
通过上图我们可以推测,如果想加入自定义信息的话,我们可以试试自定义一个chunk 当然这个自定义的chunk必须在data chunk之前,不然无法正常使用, 以下是安卓端模拟代码.自定义部分为info chunk:
/**
* 加入wav文件头
*/
private void writeWaveFileHeader(FileOutputStream out, long totalAudioLen,
long totalDataLen, long longSampleRate, int channels, long byteRate)
throws IOException {
byte[] header = new byte[92];
// RIFF/WAVE header
header[0] = 'R';
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);
//WAVE
header[8] = 'W';
header[9] = 'A';
header[10] = 'V';
header[11] = 'E';
// 'fmt ' chunk
header[12] = 'f';
header[13] = 'm';
header[14] = 't';
header[15] = ' ';
// 4 bytes: size of 'fmt ' chunk
header[16] = 18;
header[17] = 0;
header[18] = 0;
header[19] = 0;
// format = 1
header[20] = 1;
header[21] = 0;
header[22] = (byte) channels;
header[23] = 0;
header[24] = (byte) (longSampleRate & 0xff);
header[25] = (byte) ((longSampleRate >> 8) & 0xff);
header[26] = (byte) ((longSampleRate >> 16) & 0xff);
header[27] = (byte) ((longSampleRate >> 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);
// block align
header[32] = (byte) (2 * 16 / 8);
header[33] = 0;
// bits per sample
header[34] = 16;
header[35] = 0;
header[36] = 0;
header[37] = 0;
//info Chunk
header[38] = 'i';
header[39] = 'n';
header[40] = 'f';
header[41] = 'o';
// 4 bytes: size of 'info ' chunk
header[42] = (byte) 38 ;
header[43] = (byte) 0;
header[44] = (byte) 0;
header[45] = (byte) 0;
//开启tx信道录音
header[46] = (byte) 13;
header[47] = (byte) 0;
//本机id
header[48] = (byte) 64;
header[49] = (byte) -30;
header[50] = (byte) 1;
header[51] = (byte) 0;
//远端id
header[52] = (byte) 1;
header[53] = (byte) 0;
header[54] = (byte) 0;
header[55] = (byte) 0;
//区号
header[56] = (byte) 1;
//信道号
header[57] = (byte) 1;
//信道类型
header[58] = (byte) 0;
//录音类型
header[59] = (byte) 1;
//tx频率
header[60] = (byte) -64;
header[61] = (byte) 74;
header[62] = (byte) 5;
header[63] = (byte) 24;
//rx频率
header[64] = (byte) -64;
header[65] = (byte) 74;
header[66] = (byte) 5;
header[67] = (byte) 24;
//本机序列号
header[68] = (byte) 48;
header[69] = (byte) 0;
header[70] = (byte) 54;
header[71] = (byte) 0;
header[72] = (byte) 48;
header[73] = (byte) 0;
header[74] = (byte) 56;
header[75] = (byte) 0;
header[76] = (byte) 82;
header[77] = (byte) 0;
header[78] = (byte) 68;
header[79] = (byte) 0;
header[80] = (byte) 49;
header[81] = (byte) 0;
header[82] = (byte) 48;
header[83] = (byte) 0;
//data
header[84] = 'd';
header[85] = 'a';
header[86] = 't';
header[87] = 'a';
header[88] = (byte) (totalAudioLen & 0xff);
header[89] = (byte) ((totalAudioLen >> 8) & 0xff);
header[90] = (byte) ((totalAudioLen >> 16) & 0xff);
header[91] = (byte) ((totalAudioLen >> 24) & 0xff);
out.write(header, 0, 92);
}