Android Faac靜態(tài)庫與aac編碼

build_android.sh
#!/bin/bash

export NDK_HOME=/android-ndk-r10e
export SYSROOT=$NDK_HOME/platforms/android-9/arch-arm/
export TOOLCHAIN=$NDK_HOME/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
export CPU=arm
export PREFIX=$(pwd)/android/$CPU

CFLAGS="-fpic -DANDROID -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -DANDROID -Wa,--noexecstack -MMD -MP "
CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
export CPPFLAGS="$CFLAGS"
export CFLAGS="$CFLAGS"
export CXXFLAGS="$CFLAGS"
export CXX="${CROSS_COMPILE}g++ --sysroot=${SYSROOT}"
export LDFLAGS="$LDFLAGS"
export CC="${CROSS_COMPILE}gcc --sysroot=${SYSROOT}"
export NM="${CROSS_COMPILE}nm"
export STRIP="${CROSS_COMPILE}strip"
export RANLIB="${CROSS_COMPILE}ranlib"
export AR="${CROSS_COMPILE}ar"
#export LIBS="-lm"

./configure --prefix=$PREFIX \
--without-mp4v2 \
--host=arm-linux

make clean
make
make install

編碼
#include <string.h>
#include <faac.h>
#include <faaccfg.h>

int aac_Encode(char *src, char *dest, int srclen, int *dstlen)
{
    unsigned long sampleRate = 16000;  //編碼采樣率
    unsigned int numChannels = 2;         //編碼聲道數(shù)
    unsigned long inputSample = 0;        //輸入樣本大小,在打開編碼器時會得到此值
    unsigned long maxOutputBytes = 0;  //最大輸出跳夭,編碼后的輸出數(shù)據(jù)大小不會高于這個值涂圆,也是打開編碼器時獲得
    unsigned int mPCMBitSize = 16;    //pcm位深,用于計(jì)算一幀pcm大小

    int mPCMBufferSize = 0;    //一幀PCM緩存大小
    int mCountSize = 0;           //計(jì)算緩存大小

    char* mPCMBuffer;           //PCM緩存
    faacEncHandle encoder;    //faac編碼器句柄
    faacEncConfigurationPtr config;   //faac設(shè)置類

    //打開編碼器
    encoder = faacEncOpen(sampleRate, numChannels, &inputSample, &maxOutputBytes);

    //對編碼器進(jìn)行設(shè)置
    config = faacEncGetCurrentConfiguration(encoder);   //獲取當(dāng)前編碼器的設(shè)置句柄
    config->aacObjectType = LOW;    //設(shè)置AAC類型
    config->useLfe = 0;    //是否允許一個聲道為低頻通道
    config->useTns = 1;  //是否使用瞬時噪聲定形濾波器(具體作用不是很清楚)
    config->allowMidside = 0;  //是否允許midSide coding (在MPEG-2 AAC 系統(tǒng)中币叹,M/S(Mid/Side) Stereo coding被提供在多聲道信號中润歉,每個聲道對(channel pair)的組合,也就是每個通道對颈抚,是對稱地排列在人耳聽覺的左右兩邊踩衩,其方式簡單,且對位串不會引起較顯著的負(fù)擔(dān)贩汉。 一般其在左右聲道數(shù)據(jù)相似度大時常被用到驱富,并需記載每一頻帶的四種能量臨界組合,分別為左匹舞、右褐鸥、左右聲道音頻合并(L+R)及相減(L-R)的兩種新的能量。一般策菜,若所轉(zhuǎn)換的Sid聲道的能量較小時晶疼,M/S Stereo coding 可以節(jié)省此通道的位數(shù),而將多余的位應(yīng)用于另一個所轉(zhuǎn)換的聲道又憨,即Mid 聲道翠霍,進(jìn)而可提高此編碼效率。)
    config->outputFormat = 1;  // RAW_STREAM = 0, ADTS_STREAM=1  (ADTS可以實(shí)現(xiàn)單幀單獨(dú)解碼蠢莺,raw由于缺少頭無法單幀解碼寒匙,因此無法做實(shí)時傳輸)
    config->bitRate = 32000;  //設(shè)置比特率
    config->inputFormat = FAAC_INPUT_16BIT;  //設(shè)置輸入PCM格式
    faacEncSetConfiguration(encoder, config);   //應(yīng)用設(shè)置

    //計(jì)算PCM緩存所需大小以分配相應(yīng)空間
    mPCMBufferSize = inputSample * mPCMBitSize / 8;
    mPCMBuffer = new char[mPCMBufferSize];

    //開始編碼
    //判斷pcm緩存區(qū)是否已滿,如果沒有,繼續(xù)添加下一次數(shù)據(jù)锄弱,用mCountSize進(jìn)行記數(shù)
    int i,tmp;
    if (mCountSize<mPCMBufferSize)
    {
        memcpy(mPCMBuffer + mCountSize, src, srclen);
        mCountSize += srclen;
    }
    else
    {
       mCountSize = 0;   //緩存區(qū)已滿考蕾,重置記數(shù)
       unsigned char* aacData = new unsigned char[maxOutputBytes];   //編碼后輸出數(shù)據(jù)(也就是AAC數(shù)據(jù))存放位置
       //開始編碼,encoder為編碼器句柄会宪,mPCMBuffer為PCM數(shù)據(jù)肖卧,inputSample為打開編碼器時得到的輸入樣本數(shù)據(jù)
       //aacData為編碼后數(shù)據(jù)存放位置,maxOutputBytes為編碼后最大輸出字節(jié)數(shù)掸鹅,ret為編碼后數(shù)據(jù)長度
       int ret = faacEncEncode(encoder, (int32_t *)mPCMBuffer, inputSample,aacData, maxOutputBytes);
       //ret為0時不代表編碼失敗塞帐,而是編碼速度較慢,導(dǎo)致緩存還未完全flush巍沙,可用一個循環(huán)繼續(xù)調(diào)用編碼接口葵姥,當(dāng) ret>0 時表示編碼成功,且返回值為編碼后數(shù)據(jù)長度
       while (ret == 0)
       {
           ret = faacEncEncode(encoder, (int32_t *)mPCMBuffer, inputSample, aacData, maxOutputBytes);
       }
       if (ret > 0)
       {
            //AIPU_LOGD(_T("encode voice success !\n"));
            //到這里已經(jīng)編碼成功句携,aacData為編碼后數(shù)據(jù)
            *dstlen=0;
            tmp = ret;
            for(i=0; i<tmp; i++)
             {
                dest[i] = aacData[i];
             }
            *dstlen = ret;
       }
       else
       {
            //AIPU_LOGE(_T("encode failed !\n"));
       }
    }

    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榔幸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矮嫉,更是在濱河造成了極大的恐慌削咆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敞临,死亡現(xiàn)場離奇詭異态辛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挺尿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門奏黑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人编矾,你說我怎么就攤上這事熟史。” “怎么了窄俏?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵蹂匹,是天一觀的道長。 經(jīng)常有香客問我凹蜈,道長限寞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任仰坦,我火速辦了婚禮履植,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悄晃。我一直安慰自己玫霎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著庶近,像睡著了一般翁脆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鼻种,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天反番,我揣著相機(jī)與錄音,去河邊找鬼叉钥。 笑死恬口,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沼侣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼歉秫,長吁一口氣:“原來是場噩夢啊……” “哼蛾洛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雁芙,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轧膘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兔甘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谎碍,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年洞焙,在試婚紗的時候發(fā)現(xiàn)自己被綠了蟆淀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡澡匪,死狀恐怖熔任,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唁情,我是刑警寧澤疑苔,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甸鸟,受9級特大地震影響惦费,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抢韭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一薪贫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篮绰,春花似錦后雷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勉抓。三九已至,卻和暖如春候学,著一層夾襖步出監(jiān)牢的瞬間藕筋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工梳码, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隐圾,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓掰茶,卻偏偏與公主長得像暇藏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子濒蒋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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