WAV文件是在PC機平臺上很常見的、最經典的多媒體音頻文件,最先於1991年8月出如今Windows3.1操做系統上,文件擴展名爲WAV,是WaveForm的簡寫,也稱爲波形文件,可直接存儲聲音波形,還原的波形曲線十分逼真。WAV文件格式簡稱WAV格式是一種存儲聲音波形的數字音頻格式,是由微軟公司和IBM聯合設計的,WAV文件還原而成的聲音的音質取決於聲音卡採樣樣本的尺寸,採樣頻率越高,音質就越好,但開銷就越大,WAV文件也就越大。html
WAV文件不像MP3格式音頻文件,對一段完整的MP3格式音頻作任意截取是徹底OK的,音頻文件依然能夠播放,由於MP3音頻格式文件每一部分截取它都帶有音頻頭文件信息,但對一段完整的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 }
我是南國以南i記錄點滴天天成長一點點,學習是永無止境的!轉載請附原文連接!!!設計