前言:請各大網友尊重本人原創知識分享,謹記本人博客:南國以南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記錄點滴每天成長一點點,學習是永無止境的!轉載請附原文鏈接!!!