您好,登錄后才能下訂單哦!
前面介紹過給PCM錄音加44個(gè)字節(jié)頭轉(zhuǎn)為wav格式,從而能讓普通播放器進(jìn)行播放。wav格式有一個(gè)比較明顯的缺點(diǎn)就是數(shù)據(jù)比較大,因?yàn)樗菦]有壓縮過的。一般開發(fā)手機(jī)上的app,數(shù)據(jù)流量和優(yōu)化是要經(jīng)??紤]的問題,因此如果你需要將錄音上傳到服務(wù)器上,還有能夠讓普通的播放器播放的話,壓縮成mp3是比較好的解決方案,下面就介紹一下如何用lamemp3這個(gè)庫(kù)進(jìn)行壓縮。
1. 到網(wǎng)上去下載lame庫(kù),這個(gè)就不介紹了,搜索一下就搞定了,或者直接用我附件Demo中的庫(kù)也可以。
2. 將lamemp3 Add到你的項(xiàng)目中。
3. 在你的源文件中導(dǎo)入lame.h。
4. 設(shè)置壓縮的參數(shù),這些參數(shù)根據(jù)自己的需要進(jìn)行調(diào)整:
// 全局指針
lame_t lame;
// mp3壓縮參數(shù)
lame = lame_init();
lame_set_num_channels(lame, 1); // 單聲道
lame_set_in_samplerate(lame, 16000);// 16K采樣率
lame_set_brate(lame, 128);// 壓縮的比特率為128K
lame_set_mode(lame, 1);
lame_set_quality(lame, 2);
lame_init_params(lame);
5. 調(diào)用lame_encode_buffer這個(gè)函數(shù)進(jìn)行壓縮,這個(gè)函數(shù)有很多參數(shù),下面一一說明一下:
第一個(gè)參數(shù)lame_global_flags * gfp,就是我們之前聲明的全局指針,即lame
第二個(gè)參數(shù)const short int pcm_l[],short類型的錄音數(shù)據(jù),這里表示的是左聲道
第三個(gè)參數(shù)const short int pcm_r[],short類型的錄音數(shù)據(jù),這里表示的是右聲道
說明:把這兩個(gè)參數(shù)都設(shè)置為你要壓縮的錄音數(shù)據(jù)即可
第四個(gè)參數(shù)unsigned char *mp3buf,存放壓縮完后數(shù)據(jù)的緩沖區(qū),注意是unsigned char *類型
第五個(gè)參數(shù)constint mp3buf_size,緩沖區(qū)的長(zhǎng)度
我們得到的錄音數(shù)據(jù)是byte類型的,首先要將它轉(zhuǎn)換為short類型,由于一個(gè)short是兩個(gè)byte,長(zhǎng)度要減半
short *recordingData = (short *)audioData.bytes;
int pcmLen = audioData.length;
int nsamples = pcmLen / 2;
聲明一個(gè)用來存放壓縮后數(shù)據(jù)的緩沖區(qū),長(zhǎng)度就設(shè)置為pcmLen即可
unsigned char buffer[pcmLen];
調(diào)用lame_encode_buffer進(jìn)行壓縮
int recvLen = lame_encode_buffer(lame, recordingData, recordingData, nsamples, buffer, pcmLen);
注意有可能緩沖區(qū)沒有填滿,所以壓縮后數(shù)據(jù)的實(shí)際大小為recvLen,也就是lame_encode_buffer的返回值
把壓縮后的數(shù)據(jù)添加到一個(gè)NSMutable中
[mp3Datas appendBytes:buffer length:recvLen];
6. 錄音結(jié)束后,保存到Document文件中
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [path stringByAppendingPathComponent:@"recording.mp3"];
[mp3Datas writeToFile:filePath atomically:YES];
[mp3Datas release];
7. 釋放lame資源
lame_close(lame);
以上就是用lame進(jìn)行壓縮的主要步驟,我設(shè)置的錄音格式是:16位 16k的pcm,這個(gè)要和lame設(shè)置的參數(shù)對(duì)應(yīng)上,否則壓縮是會(huì)有問題的。
整個(gè)Demo我已經(jīng)上傳到附件中,點(diǎn)擊“開始說話”按鈕進(jìn)行錄音,然后再點(diǎn)擊“說完了”停止錄音。
我把壓縮后的MP3數(shù)據(jù)存放在Documents下的recording.mp3文件中,需要的話可以自行用AVAudioPlayer進(jìn)行播放,或直接把recording.mp3拷出來,用一般的音樂播放器播放。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。