iOS 音頻轉(zhuǎn)換成 MP3格式

-------------------------------此文僅做記錄-------------------------------------


iOS 音頻轉(zhuǎn)換成 MP3格式

1. 工具

  1. Lame 庫
  2. 編譯 lame 庫的腳本

解壓 lame 庫到桌面,然后將下載后的腳本放到 lame 的文件夾內(nèi)


image.png

build-lame.sh有幾處需要修改的地方

#!/bin/sh

CONFIGURE_FLAGS="--disable-shared --disable-frontend"

#選擇你需要集成的架構(gòu)模式裳瘪,一般真機(jī)模式下只需要arm64 armv7s就可以,集成太多的架構(gòu)會對 ipa 包的大小有影響,后期優(yōu)化 app 大小還是要分離出不需要的架構(gòu)模式。
ARCHS="arm64 armv7s x86_64 i386 armv7"
#ARCHS="arm64 armv7s armv7"

# directories
SOURCE=""
#生成的libmp3lame.a文件目錄和lame.h文件目錄
FAT="fat-lame"

#解壓的 lame 目錄
SCRATCH="/Users/tongxing/Desktop/lame"
# must be an absolute path
THIN=`pwd`/"thin-lame"

COMPILE="y"
LIPO="y"

if [ "$*" ]
then
    if [ "$*" = "lipo" ]
    then
        # skip compile
        COMPILE=
    else
        ARCHS="$*"
        if [ $# -eq 1 ]
        then
            # skip lipo
            LIPO=
        fi
    fi
fi

if [ "$COMPILE" ]
then
    CWD=`pwd`
    for ARCH in $ARCHS
    do
        echo "building $ARCH..."
        mkdir -p "$SCRATCH/$ARCH"
        cd "$SCRATCH/$ARCH"

        if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
        then
            PLATFORM="iPhoneSimulator"
            if [ "$ARCH" = "x86_64" ]
            then
                SIMULATOR="-mios-simulator-version-min=7.0"
                        HOST=x86_64-apple-darwin
            else
                SIMULATOR="-mios-simulator-version-min=5.0"
                        HOST=i386-apple-darwin
            fi
        else
            PLATFORM="iPhoneOS"
            SIMULATOR=
                    HOST=arm-apple-darwin
        fi

        XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
        CC="xcrun -sdk $XCRUN_SDK clang -arch $ARCH"
        #AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
        CFLAGS="-arch $ARCH $SIMULATOR"
        if ! xcodebuild -version | grep "Xcode [1-6]\."
        then
            CFLAGS="$CFLAGS -fembed-bitcode"
        fi
        CXXFLAGS="$CFLAGS"
        LDFLAGS="$CFLAGS"

        CC=$CC $CWD/$SOURCE/configure \
            $CONFIGURE_FLAGS \
                    --host=$HOST \
            --prefix="$THIN/$ARCH" \
                    CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"

        make -j3 install
        cd $CWD
    done
fi

if [ "$LIPO" ]
then
    echo "building fat binaries..."
    mkdir -p $FAT/lib
    set - $ARCHS
    CWD=`pwd`
    cd $THIN/$1/lib
    for LIB in *.a
    do
        cd $CWD
        lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
    done

    cd $CWD
    cp -rf $THIN/$1/include $FAT
fi

2. 編譯

打開終端泳叠,進(jìn)入 lame 目錄運(yùn)行下面命令

./build-lame.sh

接著等待終端編譯完成,就可以在 lame 目錄的 fat-lame里看到編譯后的.a文件和.h文件

3. 使用

將 libmpslame.a 文件和 lame.h 文件直接拖到工程文件中


image.png

這里提供一個將 .wav 文件轉(zhuǎn)換成 .mp3文件的方法

+(NSString *)stransformToMp3ByUrlWithUrl:(NSString *)docPath{
    NSError *error;
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)objectAtIndex:0];
    NSFileManager *fm = [NSFileManager defaultManager];
    if (YES != [fm fileExistsAtPath:path]) {
        if (YES != [fm createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]) {
            PCDLog(@"create dir path=%@, error=%@", path, error);
        }
    }
    
    NSString *prefix = [docPath stringByDeletingPathExtension];
    NSString *mp3FileName = [prefix stringByAppendingPathExtension:@"mp3"];
#8000是電話的采樣率,基本可以滿足
    int mSampleRate = 8000.0;

    if ([[NSFileManager defaultManager] fileExistsAtPath:mp3FileName]) {
        //刪除
        NSError *error = nil;
        [[NSFileManager defaultManager] removeItemAtPath:mp3FileName error:&error];
    }
    @try {
        int read, write;
        FILE *pcm = fopen([docPath cStringUsingEncoding:1], "rb"); //source 被轉(zhuǎn)換的音頻文件位置
        //音頻不能為空
        if (!pcm) {
            return nil;
        }
        fseek(pcm, 4*1024, SEEK_CUR); //skip file header
        FILE *mp3 = fopen([mp3FileName cStringUsingEncoding:1], "wb"); //output 輸出生成的Mp3文件位置
        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();
        
        /*這邊設(shè)置的參數(shù)需要與錄音時設(shè)置的參數(shù)做對照内列,否則壓縮會出現(xiàn)問題
         asbd.mSampleRate = 8000;            //采樣率
         asbd.mFormatID = kAudioFormatLinearPCM;
         asbd.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
         asbd.mChannelsPerFrame = 1;         //單聲道
         asbd.mFramesPerPacket = 1;          //每一個packet一偵數(shù)據(jù)
         asbd.mBitsPerChannel = 16;          //每個采樣點(diǎn)16bit量化
         asbd.mBytesPerFrame = (asbd.mBitsPerChannel / 8) * asbd.mChannelsPerFrame;
         asbd.mBytesPerPacket = asbd.mBytesPerFrame ;
         */
        lame_set_num_channels(lame,1); // 單聲道
        //!!!:經(jīng)過測試,這里設(shè)置采樣率為錄音時的采樣率的一半為最佳音效
        lame_set_in_samplerate(lame, mSampleRate); //8000 // 采樣率
        lame_set_VBR(lame, vbr_default);
        lame_set_brate(lame, 16); //壓縮的比特率為16K
        lame_set_mode(lame, 2); // 四種類型的聲道
        lame_set_quality(lame, 5);// 2=high 5 = medium 7=low 音 質(zhì)
        lame_init_params(lame);
        do {
            read = fread(pcm_buffer, 2*sizeof(short int), PCM_SIZE, pcm);
            if (read == 0)
                write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
            else
            
                /**
                 采用lame_encode_buffer_interleaved函數(shù)進(jìn)行壓縮

                 @param lame_global_flags 全局變量lame
                 @param const short int     buffer_l [] short類型的錄音數(shù)據(jù),這里表示的是左聲道
                 @param const short int     buffer_r [] short類型的錄音數(shù)據(jù),這里表示的是右聲道
                 @param int num_samples     聲道類型
                 @param unsigned char*  mp3buf 存放壓縮完后數(shù)據(jù)的緩沖區(qū)服傍,注意是unsigned char
                 @param int mp3buf_size 緩沖區(qū)的長度
                 @return N/A
                 */
                write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
            fwrite(mp3_buffer, write, 1, mp3);
        } while (read != 0);
        lame_close(lame);
        fclose(mp3);
        fclose(pcm);
    }
    @catch (NSException *exception) {
        PCDLog(@"%@",[exception description]);
    }
    @finally {
        PCDLog(@"MP3生成成功: %@",mp3FileName);
    }
   
    return mp3FileName;
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末套蒂,一起剝皮案震驚了整個濱河市婴洼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亡脸,老刑警劉巖垂谢,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缰犁,死亡現(xiàn)場離奇詭異并徘,居然都是意外死亡路幸,警方通過查閱死者的電腦和手機(jī)能扒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人置济,你說我怎么就攤上這事黄琼〖粮” “怎么了衰伯?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵夭委,是天一觀的道長。 經(jīng)常有香客問我蚂且,道長,這世上最難降的妖魔是什么遭京? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮慌申,結(jié)果婚禮上赚爵,老公的妹妹穿的比我還像新娘酥夭。我一直安慰自己,他們只是感情好效五,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著适瓦,像睡著了一般玻熙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崎溃,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天乡范,我揣著相機(jī)與錄音霸饲,去河邊找鬼厚脉。 笑死,一個胖子當(dāng)著我的面吹牛胶惰,可吹牛的內(nèi)容都是我干的傻工。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼孵滞,長吁一口氣:“原來是場噩夢啊……” “哼中捆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坊饶,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泄伪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匿级,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟋滴,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡染厅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了津函。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糟秘。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖球散,靈堂內(nèi)的尸體忽然破棺而出尿赚,到底是詐尸還是另有隱情,我是刑警寧澤蕉堰,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布凌净,位于F島的核電站,受9級特大地震影響屋讶,放射性物質(zhì)發(fā)生泄漏冰寻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一皿渗、第九天 我趴在偏房一處隱蔽的房頂上張望斩芭。 院中可真熱鬧,春花似錦乐疆、人聲如沸划乖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琴庵。三九已至,卻和暖如春仰美,著一層夾襖步出監(jiān)牢的瞬間迷殿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工咖杂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庆寺,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓诉字,卻偏偏與公主長得像懦尝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奏窑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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