点评
本源码只提供了生成 文件头 的函数,只返回文件头(只返回固定44字节!),如果将pcm转成wav,请参考下面公式
WAV字节集 = 文件头字节集+PCM字节集
让我们一起来观赏一下pcm变成wav的过程吧!
- byte[] header = new byte[44];
- header[0] = 'R'; // RIFF
- header[1] = 'I';
- header[2] = 'F';
- header[3] = 'F';
- header[4] = (byte) (totalWavSize & 0xff);//xx大小
- header[5] = (byte) ((totalWavSize >> 8) & 0xff);
- header[6] = (byte) ((totalWavSize >> 16) & 0xff);
- header[7] = (byte) ((totalWavSize >> 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] = ' ';//过渡字节
- //xx大小
- header[16] = 16; // 4 bytes: size of 'fmt ' chunk
- header[17] = 0;
- header[18] = 0;
- header[19] = 0;
- //编码方式 10H为PCM编码格式
- 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);
- //音频xx传送速率,采样率*通道数*采样深度/8
- header[28] = (byte) (byteRate & 0xff);
- header[29] = (byte) ((byteRate >> 8) & 0xff);
- header[30] = (byte) ((byteRate >> 16) & 0xff);
- header[31] = (byte) ((byteRate >> 24) & 0xff);
- // 确定系统一次要处理多少个这样字节的xx,确定缓冲区,通道数*采样位数
- header[32] = (byte) (channels * 16 / 8);
- header[33] = 0;
- //每个样本的xx位数
- header[34] = 16;
- header[35] = 0;
- //Data chunk
- header[36] = 'd';//data
- header[37] = 'a';
- header[38] = 't';
- header[39] = 'a';
- header[40] = (byte) (totalPcmSize & 0xff);
- header[41] = (byte) ((totalPcmSize >> 8) & 0xff);
- header[42] = (byte) ((totalPcmSize >> 16) & 0xff);
- header[43] = (byte) ((totalPcmSize >> 24) & 0xff);
- os.write(header, 0, 44);