解析WAV音頻文件----》生成WAV音頻文件頭

前言:請各大網友尊重本人原創知識分享,謹記本人博客:南國以南i

WAV音頻文件介紹:

WAV文件是在PC機平臺上很常見的、最經典的多媒體音頻文件,最先於1991年8月出如今Windows3.1操做系統上,文件擴展名爲WAV,是WaveForm的簡寫,也稱爲波形文件,可直接存儲聲音波形,還原的波形曲線十分逼真。WAV文件格式簡稱WAV格式是一種存儲聲音波形的數字音頻格式,是由微軟公司和IBM聯合設計的,WAV文件還原而成的聲音的音質取決於聲音卡採樣樣本的尺寸,採樣頻率越高,音質就越好,但開銷就越大,WAV文件也就越大。html

對WAV音頻文件截取說明:

WAV文件不像MP3格式音頻文件,對一段完整的MP3格式音頻作任意截取是徹底OK的,音頻文件依然能夠播放,由於MP3音頻格式文件每一部分截取它都帶有音頻頭文件信息,但對一段完整的WAV音頻文件作部分截取,截取出來的音頻文件是沒法播放的,除非截取的是從第一位開始截取,截取的數據已經包含的頭文件,不然文件沒法解析播放。數組

生成WAV頭部文件須要四個參數(附代碼說明):

注:獲取WAV音頻信息參數學習

1、聲道數、編碼

2、採樣率、spa

3、採樣精度操作系統

4、音頻數據總長度、.net

 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記錄點滴天天成長一點點,學習是永無止境的!轉載請附原文連接!!!設計

相關文章
相關標籤/搜索