iOS 音頻WAV轉(zhuǎn)mp3

/**
 ConvertMp3
 
 @param cafFilePath caf FilePath
 @param mp3FilePath mp3 FilePath
 @param sampleRate sampleRate (same record sampleRate set)我傳的8000.0
 */
- (void)conventToMp3WithCafFilePath:(NSString *)cafFilePath
                        mp3FilePath:(NSString *)mp3FilePath
                         sampleRate:(int)sampleRate
                           
{
    
       @try {

        int read, write;
        //source 被轉(zhuǎn)換的音頻文件位置
        FILE *pcm = fopen([wavPath cStringUsingEncoding:NSASCIIStringEncoding], "rb");
        //output 輸出生成的Mp3文件位置
        FILE *mp3 = fopen([mp3Path cStringUsingEncoding:NSASCIIStringEncoding], "wb+");

        const int PCM_SIZE = 8192;
        const int MP3_SIZE = 8192;
        short int pcm_buffer[PCM_SIZE * 2];
        unsigned char mp3_buffer[MP3_SIZE];

        lame_t lame = lame_init();
        lame_set_in_samplerate(lame, 8000.0);
        lame_set_VBR(lame, vbr_default);
        lame_init_params(lame);

        long curpos;
        BOOL isSkipPCMHeader = NO;

        do {
            curpos = ftell(pcm);
            fseek(pcm, 0, SEEK_END);
            fseek(pcm, curpos, SEEK_SET);
            if (!isSkipPCMHeader) {
                //Uump audio file header, If you do not skip file header
                //you will heard some noise at the beginning!!!
                //skip file header 跳過 PCM header 能保證錄音的開頭沒有噪音
                fseek(pcm, 4 * 1024, SEEK_CUR);
                isSkipPCMHeader = YES;
//                NSLog(@"skip pcm file header !!!!!!!!!!");
            }
            read = (int)fread(pcm_buffer, 2 * sizeof(short int), PCM_SIZE, pcm);
            write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
            fwrite(mp3_buffer, write, 1, mp3);
        } while (read != 0);

        read = (int)fread(pcm_buffer, 2 * sizeof(short int), PCM_SIZE, pcm);
        write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);

//        NSLog(@"read %d bytes and flush to mp3 file", write);
        lame_mp3_tags_fid(lame, mp3);

        lame_close(lame);
        fclose(mp3);
        fclose(pcm);
    }
    @catch (NSException *exception) {
        NSLog(@"%@",[exception description]);
    }
    @finally {
        
        [[NSFileManager defaultManager] removeItemAtPath:wavPath error:nil];
        self.filePath = mp3Path;
        // 這個(gè)是自己定義的一些方法
        if (self.delegate &&[self.delegate respondsToSelector:@selector(voiceRecordHasBeenStoped)]) {
            [self.delegate voiceRecordHasBeenStoped];
        }
    }

}

下面是一些說明:
C 語言的 文件打開模式(fopen)

w+以純文本方式讀寫,而wb+是以二進(jìn)制方式進(jìn)行讀寫。

mode說明:

w 打開只寫文件,若文件存在則文件長度清為0邦邦,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件醉蚁。

w+ 打開可讀寫文件燃辖,若文件存在則文件長度清為零,即該文件內(nèi)容會(huì)消失网棍。若文件不存在則建立該文件黔龟。

wb 只寫方式打開或新建一個(gè)二進(jìn)制文件,只允許寫數(shù)據(jù)滥玷。

wb+ 讀寫方式打開或建立一個(gè)二進(jìn)制文件氏身,允許讀和寫。

r 打開只讀文件惑畴,該文件必須存在蛋欣,否則報(bào)錯(cuò)。

r+ 打開可讀寫的文件桨菜,該文件必須存在豁状,否則報(bào)錯(cuò)捉偏。

rb+ 讀寫方式打開一個(gè)二進(jìn)制文件倒得,只允許讀寫數(shù)據(jù)。

a 以附加的方式打開只寫文件夭禽。若文件不存在霞掺,則會(huì)建立該文件,如果文件存在讹躯,寫入的數(shù)據(jù)會(huì)被加到文件尾菩彬,即文件原先的內(nèi)容會(huì)被保留缠劝。(EOF符保留)

a+ 以附加方式打開可讀寫的文件。若文件不存在骗灶,則會(huì)建立該文件惨恭,如果文件存在,寫入的數(shù)據(jù)會(huì)被加到文件尾后耙旦,即文件原先的內(nèi)容會(huì)被保留脱羡。 (原來的EOF符不保留)

ab+ 讀寫打開一個(gè)二進(jìn)制文件,允許讀或在文件末追加數(shù)據(jù)免都。

加入b 字符用來告訴函數(shù)庫打開的文件為二進(jìn)制文件锉罐,而非純文字文件。

然后是lame_init()來初始化,lame_set_num_channels(lame,1)默認(rèn)轉(zhuǎn)碼為2雙通道, 設(shè)置單聲道會(huì)更大程度減少壓縮后文件的體積.

接下來 是執(zhí)行一個(gè) do while 的循環(huán)來反復(fù)讀取FILE* stream, 直到 read != 0 , 結(jié)束轉(zhuǎn)碼,釋放lame_close(lame); fclose(mp3); fclose(pcm);

以上參考地址:http://www.reibang.com/p/7df304895a6b

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绕娘,一起剝皮案震驚了整個(gè)濱河市脓规,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌险领,老刑警劉巖侨舆,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舷暮,居然都是意外死亡态罪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門下面,熙熙樓的掌柜王于貴愁眉苦臉地迎上來复颈,“玉大人,你說我怎么就攤上這事沥割『睦玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵机杜,是天一觀的道長帜讲。 經(jīng)常有香客問我,道長椒拗,這世上最難降的妖魔是什么似将? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蚀苛,結(jié)果婚禮上在验,老公的妹妹穿的比我還像新娘。我一直安慰自己堵未,他們只是感情好腋舌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渗蟹,像睡著了一般块饺。 火紅的嫁衣襯著肌膚如雪赞辩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天授艰,我揣著相機(jī)與錄音辨嗽,去河邊找鬼。 笑死淮腾,一個(gè)胖子當(dāng)著我的面吹牛召庞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播来破,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼篮灼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徘禁?” 一聲冷哼從身側(cè)響起诅诱,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎送朱,沒想到半個(gè)月后娘荡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驶沼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年炮沐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片回怜。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡大年,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出玉雾,到底是詐尸還是另有隱情翔试,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布复旬,位于F島的核電站垦缅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驹碍。R本人自食惡果不足惜壁涎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望志秃。 院中可真熱鬧怔球,春花似錦、人聲如沸洽损。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碑定。三九已至流码,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間延刘,已是汗流浹背漫试。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碘赖,地道東北人驾荣。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像普泡,于是被迫代替她去往敵國和親播掷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容