溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

iOS下使用lamemp3庫(kù)將PCM錄音數(shù)據(jù)壓縮為MP3格式

發(fā)布時(shí)間:2020-07-15 11:09:48 來源:網(wǎng)絡(luò) 閱讀:10561 作者:iKingLai 欄目:移動(dòng)開發(fā)

前面介紹過給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拷出來,用一般的音樂播放器播放。






附件:http://down.51cto.com/data/2363064
向AI問一下細(xì)節(jié)

免責(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)容。

AI