十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
背景

因?yàn)槲业墓拘枰O(shè)計(jì)到app與硬件的通信,所以去年深入的研究了一下音頻各種格式的轉(zhuǎn)換,曾寫過一篇簡(jiǎn)書,現(xiàn)在搬過來豐富下自己的blog。
首先介紹一下常用的音頻文件格式
由于App是通過AVAudioRecorder錄制音頻,默認(rèn)格式為pcm,文件比較大,所以不適合用于聊天通信的文件格式,所以最優(yōu)的選擇是轉(zhuǎn)換成amr格式
音頻格式轉(zhuǎn)換方式
.pcm-->.wav-->.amr
a)將pcm轉(zhuǎn)成wav
什么是WAV和PCM?
WAV:wav是一種無損的音頻文件格式,WAV符合 PIFF(Resource Interchange File Format)規(guī)范。所有的WAV都有一個(gè)文件頭,這個(gè)文件頭音頻流的編碼參數(shù)。WAV對(duì)音頻流的編碼沒有硬性規(guī)定,除了PCM之外,還有幾乎所有支持ACM規(guī)范的編碼都可以為WAV的音頻流進(jìn)行編碼。
PCM:PCM(Pulse Code Modulation----脈碼調(diào)制錄音)。所謂PCM錄音就是將聲音等模擬信號(hào)變成符號(hào)化的脈沖列,再予以記錄。PCM信號(hào)是由[1]、[0]等符號(hào)構(gòu)成的數(shù)字信號(hào),而未經(jīng)過任何編碼和壓縮處理。與模擬信號(hào)比,它不易受傳送系統(tǒng)的雜波及失真的影響。動(dòng)態(tài)范圍寬,可得到音質(zhì)相當(dāng)好的影響效果。
簡(jiǎn)單來說:wav是一種無損的音頻文件格式,pcm是沒有壓縮的編碼方式。
WAV和PCM的關(guān)系
WAV可以使用多種音頻編碼來壓縮其音頻流,不過我們常見的都是音頻流被PCM編碼處理的WAV,但這不表示W(wǎng)AV只能使用PCM編碼,MP3編碼同樣也可以運(yùn)用在WAV中,和AVI一樣,只要安裝好了相應(yīng)的Decode,就可以欣賞這些WAV了。在Windows平臺(tái)下,基于PCM編碼的WAV是被支持得最好的音頻格式,所有音頻軟件都能完美支持,由于本身可以達(dá)到較高的音質(zhì)的要求,因此,WAV也是音樂編輯創(chuàng)作的選格式,適合保存音樂素材。因此,基于PCM編碼的WAV被作為了一種中介的格式,常常使用在其他編碼的相互轉(zhuǎn)換之中,例如MP3轉(zhuǎn)換成WMA。
簡(jiǎn)單來說:pcm是無損wav文件中音頻數(shù)據(jù)的一種編碼方式,但wav還可以用其它方式編碼。
這里詳細(xì)寫了pcm和wav的區(qū)別,我簡(jiǎn)單概括成pcm少了一個(gè)wav頭描述信息。為此我從訊飛語音的sdk中移植出填寫wav頭的函數(shù)并修改了一下
// 為pcm文件寫入wav頭
+ (NSData*) writeWavHead:(NSData *)audioData {
long sampleRate = [[self GetAudioRecorderSettingDict][AVSampleRateKey] longValue];
long numOfChannelsKey = [[self GetAudioRecorderSettingDict][AVNumberOfChannelsKey] longValue];
Byte waveHead[44];
waveHead[0] = 'R';
waveHead[1] = 'I';
waveHead[2] = 'F';
waveHead[3] = 'F';
long totalDatalength = [audioData length] + 44;
waveHead[4] = (Byte)(totalDatalength & 0xff);
waveHead[5] = (Byte)((totalDatalength >> 8) & 0xff);
waveHead[6] = (Byte)((totalDatalength >> 16) & 0xff);
waveHead[7] = (Byte)((totalDatalength >> 24) & 0xff);
waveHead[8] = 'W';
waveHead[9] = 'A';
waveHead[10] = 'V';
waveHead[11] = 'E';
waveHead[12] = 'f';
waveHead[13] = 'm';
waveHead[14] = 't';
waveHead[15] = ' ';
waveHead[16] = 16; //size of 'fmt '
waveHead[17] = 0;
waveHead[18] = 0;
waveHead[19] = 0;
waveHead[20] = 1; //format
waveHead[21] = 0;
waveHead[22] = numOfChannelsKey; //chanel
waveHead[23] = 0;
waveHead[24] = (Byte)(sampleRate & 0xff);
waveHead[25] = (Byte)((sampleRate >> 8) & 0xff);
waveHead[26] = (Byte)((sampleRate >> 16) & 0xff);
waveHead[27] = (Byte)((sampleRate >> 24) & 0xff);
long byteRate = sampleRate * 2 * (16 >> 3);;
waveHead[28] = (Byte)(byteRate & 0xff);
waveHead[29] = (Byte)((byteRate >> 8) & 0xff);
waveHead[30] = (Byte)((byteRate >> 16) & 0xff);
waveHead[31] = (Byte)((byteRate >> 24) & 0xff);
waveHead[32] = 2*(16 >> 3);
waveHead[33] = 0;
waveHead[34] = 16;
waveHead[35] = 0;
waveHead[36] = 'd';
waveHead[37] = 'a';
waveHead[38] = 't';
waveHead[39] = 'a';
long totalAudiolength = [audioData length];
waveHead[40] = (Byte)(totalAudiolength & 0xff);
waveHead[41] = (Byte)((totalAudiolength >> 8) & 0xff);
waveHead[42] = (Byte)((totalAudiolength >> 16) & 0xff);
waveHead[43] = (Byte)((totalAudiolength >> 24) & 0xff);
NSMutableData *pcmData = [[NSMutableData alloc]initWithBytes:&waveHead length:sizeof(waveHead)];
[pcmData appendData:audioData];
return pcmData;
// [pcmData writeToFile:kVoiceWav atomically:true];
}另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。