解析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头部文件需要四个参数(附代码说明):

注:获取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记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

posted @ 2020-08-29 19:42  南国以南i  阅读(953)  评论(0编辑  收藏  举报