您好,登錄后才能下訂單哦!
前面介紹過給PCM錄音加44個字節頭轉為wav格式,從而能讓普通播放器進行播放。wav格式有一個比較明顯的缺點就是數據比較大,因為它是沒有壓縮過的。一般開發手機上的app,數據流量和優化是要經常考慮的問題,因此如果你需要將錄音上傳到服務器上,還有能夠讓普通的播放器播放的話,壓縮成mp3是比較好的解決方案,下面就介紹一下如何用lamemp3這個庫進行壓縮。
1. 到網上去下載lame庫,這個就不介紹了,搜索一下就搞定了,或者直接用我附件Demo中的庫也可以。
2. 將lamemp3 Add到你的項目中。
3. 在你的源文件中導入lame.h。
4. 設置壓縮的參數,這些參數根據自己的需要進行調整:
// 全局指針
lame_t lame;
// mp3壓縮參數
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. 調用lame_encode_buffer這個函數進行壓縮,這個函數有很多參數,下面一一說明一下:
第一個參數lame_global_flags * gfp,就是我們之前聲明的全局指針,即lame
第二個參數const short int pcm_l[],short類型的錄音數據,這里表示的是左聲道
第三個參數const short int pcm_r[],short類型的錄音數據,這里表示的是右聲道
說明:把這兩個參數都設置為你要壓縮的錄音數據即可
第四個參數unsigned char *mp3buf,存放壓縮完后數據的緩沖區,注意是unsigned char *類型
第五個參數constint mp3buf_size,緩沖區的長度
我們得到的錄音數據是byte類型的,首先要將它轉換為short類型,由于一個short是兩個byte,長度要減半
short *recordingData = (short *)audioData.bytes;
int pcmLen = audioData.length;
int nsamples = pcmLen / 2;
聲明一個用來存放壓縮后數據的緩沖區,長度就設置為pcmLen即可
unsigned char buffer[pcmLen];
調用lame_encode_buffer進行壓縮
int recvLen = lame_encode_buffer(lame, recordingData, recordingData, nsamples, buffer, pcmLen);
注意有可能緩沖區沒有填滿,所以壓縮后數據的實際大小為recvLen,也就是lame_encode_buffer的返回值
把壓縮后的數據添加到一個NSMutable中
[mp3Datas appendBytes:buffer length:recvLen];
6. 錄音結束后,保存到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進行壓縮的主要步驟,我設置的錄音格式是:16位 16k的pcm,這個要和lame設置的參數對應上,否則壓縮是會有問題的。
整個Demo我已經上傳到附件中,點擊“開始說話”按鈕進行錄音,然后再點擊“說完了”停止錄音。
我把壓縮后的MP3數據存放在Documents下的recording.mp3文件中,需要的話可以自行用AVAudioPlayer進行播放,或直接把recording.mp3拷出來,用一般的音樂播放器播放。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。