解析WAV音频文件----》生成WAV音频文件头
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i
WAV音频文件介绍:
WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统上,文件扩展名为WAV,是WaveForm的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,WAV文件还原而成的声音的音质取决于声音卡采样样本的尺寸,采样频率越高,音质就越好,但开销就越大,WAV文件也就越大。
对WAV音频文件截取说明:
WAV文件不像MP3格式音频文件,对一段完整的MP3格式音频做任意截取是完全OK的,音频文件依然可以播放,因为MP3音频格式文件每一部分截取它都带有音频头文件信息,但对一段完整的WAV音频文件做部分截取,截取出来的音频文件是无法播放的,除非截取的是从第一位开始截取,截取的数据已经包含的头文件,否则文件无法解析播放。
生成WAV头部文件需要四个参数(附代码说明):
一、声道数、
二、采样率、
三、采样精度
四、音频数据总长度、
1 /** 2 * @param totalAudioLen 不包括header的音频数据总长度 3 * @param longSampleRate 采样率,也就是录制时使用的频率、音频采样级别 8000 = 8KHz 4 * @param channels audioRecord的声道数1/2 5 * @param audioFormat 采样精度; 譬如 16bit 6 * @throws IOException 写文件错误 7 */ 8 private static byte[] writeWavFileHeader(long totalAudioLen, long longSampleRate, 9 int channels, int audioFormat) throws IOException { 10 byte[] header = generateWavFileHeader(totalAudioLen, longSampleRate, channels,audioFormat); 11 return header; 12 } 13 14 /** 15 * @param totalAudioLen 不包括header的音频数据总长度 16 * @param longSampleRate 采样率,也就是录制时使用的频率 17 * @param channels audioRecord的频道数量 18 * @param audioFormat 采样精度; 譬如 16bit 19 */ 20 private static byte[] generateWavFileHeader(long totalAudioLen, long longSampleRate, int channels,int audioFormat) { 21 long totalDataLen = totalAudioLen + 36; 22 long byteRate = longSampleRate * 2 * channels; 23 byte[] header = new byte[44]; 24 header[0] = 'R'; // RIFF 25 header[1] = 'I'; 26 header[2] = 'F'; 27 header[3] = 'F'; 28 //文件长度 4字节文件长度,这个长度不包括"RIFF"标志(4字节)和文件长度本身所占字节(4字节),即该长度等于整个文件长度 - 8 29 header[4] = (byte) (totalDataLen & 0xff); 30 header[5] = (byte) ((totalDataLen >> 8) & 0xff); 31 header[6] = (byte) ((totalDataLen >> 16) & 0xff); 32 header[7] = (byte) ((totalDataLen >> 24) & 0xff); 33 //fcc type:4字节 "WAVE" 类型块标识, 大写 34 header[8] = 'W'; 35 header[9] = 'A'; 36 header[10] = 'V'; 37 header[11] = 'E'; 38 //FMT Chunk 4字节 表示"fmt" chunk的开始,此块中包括文件内部格式信息,小写, 最后一个字符是空格 39 header[12] = 'f'; // 'fmt ' 40 header[13] = 'm'; 41 header[14] = 't'; 42 header[15] = ' ';//过渡字节 43 //数据大小 4字节,文件内部格式信息数据的大小,过滤字节(一般为00000010H) 44 header[16] = 16; 45 header[17] = 0; 46 header[18] = 0; 47 header[19] = 0; 48 //编码方式 10H为PCM编码格式 FormatTag:2字节,音频数据的编码方式,1:表示是PCM 编码 49 header[20] = 1; // format = 1 50 header[21] = 0; 51 //通道数 Channels:2字节,声道数,单声道为1,双声道为2 52 header[22] = (byte) channels; 53 header[23] = 0; 54 //采样率,每个通道的播放速度 55 header[24] = (byte) (longSampleRate & 0xff); 56 header[25] = (byte) ((longSampleRate >> 8) & 0xff); 57 header[26] = (byte) ((longSampleRate >> 16) & 0xff); 58 header[27] = (byte) ((longSampleRate >> 24) & 0xff); 59 //音频数据传送速率,采样率*通道数*采样深度/8 60 //4字节,音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件利用此值可以估计缓冲区的大小 61 //byteRate = sampleRate * (bitsPerSample / 8) * channels 62 header[28] = (byte) (byteRate & 0xff); 63 header[29] = (byte) ((byteRate >> 8) & 0xff); 64 header[30] = (byte) ((byteRate >> 16) & 0xff); 65 header[31] = (byte) ((byteRate >> 24) & 0xff); 66 // 确定系统一次要处理多少个这样字节的数据,确定缓冲区,通道数*采样位数 67 header[32] = (byte) (2 * channels); 68 header[33] = 0; 69 //每个样本的数据位数 70 //2字节,每个声道的采样精度; 譬如 16bit 在这里的值就是16。如果有多个声道,则每个声道的采样精度大小都一样的; 71 header[34] = (byte) audioFormat; 72 header[35] = 0; 73 //Data chunk 74 //ckid:4字节,数据标志符(data),表示 "data" chunk的开始。此块中包含音频数据,小写; 75 header[36] = 'd'; 76 header[37] = 'a'; 77 header[38] = 't'; 78 header[39] = 'a'; 79 //音频数据的长度,4字节,audioDataLen = totalDataLen - 36 = fileLenIncludeHeader - 44 80 header[40] = (byte) (totalAudioLen & 0xff); 81 header[41] = (byte) ((totalAudioLen >> 8) & 0xff); 82 header[42] = (byte) ((totalAudioLen >> 16) & 0xff); 83 header[43] = (byte) ((totalAudioLen >> 24) & 0xff); 84 return header; 85 }
本人亲测!!!完成以上代码即可生成WAV音频头文件,即可把头文件和截取的部分WAV音频数据进行字节数组合并,音频文件正常播放!
参考文章一、参考文章二
个人总结:
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!