当前位置: 首页 > 工具软件 > faac > 使用案例 >

android aac编解码库,Android Faac静态库与aac编码

杨波娃
2023-12-01

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

#include

#include

int aac_Encode(char *src, char *dest, int srclen, int *dstlen)

{

unsigned long sampleRate = 16000; //编码采样率

unsigned int numChannels = 2; //编码声道数

unsigned long inputSample = 0; //输入样本大小,在打开编码器时会得到此值

unsigned long maxOutputBytes = 0; //最大输出,编码后的输出数据大小不会高于这个值,也是打开编码器时获得

unsigned int mPCMBitSize = 16; //pcm位深,用于计算一帧pcm大小

int mPCMBufferSize = 0; //一帧PCM缓存大小

int mCountSize = 0; //计算缓存大小

char* mPCMBuffer; //PCM缓存

faacEncHandle encoder; //faac编码器句柄

faacEncConfigurationPtr config; //faac设置类

//打开编码器

encoder = faacEncOpen(sampleRate, numChannels, &inputSample, &maxOutputBytes);

//对编码器进行设置

config = faacEncGetCurrentConfiguration(encoder); //获取当前编码器的设置句柄

config->aacObjectType = LOW; //设置AAC类型

config->useLfe = 0; //是否允许一个声道为低频通道

config->useTns = 1; //是否使用瞬时噪声定形滤波器(具体作用不是很清楚)

config->allowMidside = 0; //是否允许midSide coding (在MPEG-2 AAC 系统中,M/S(Mid/Side) Stereo coding被提供在多声道信号中,每个声道对(channel pair)的组合,也就是每个通道对,是对称地排列在人耳听觉的左右两边,其方式简单,且对位串不会引起较显著的负担。 一般其在左右声道数据相似度大时常被用到,并需记载每一频带的四种能量临界组合,分别为左、右、左右声道音频合并(L+R)及相减(L-R)的两种新的能量。一般,若所转换的Sid声道的能量较小时,M/S Stereo coding 可以节省此通道的位数,而将多余的位应用于另一个所转换的声道,即Mid 声道,进而可提高此编码效率。)

config->outputFormat = 1; // RAW_STREAM = 0, ADTS_STREAM=1 (ADTS可以实现单帧单独解码,raw由于缺少头无法单帧解码,因此无法做实时传输)

config->bitRate = 32000; //设置比特率

config->inputFormat = FAAC_INPUT_16BIT; //设置输入PCM格式

faacEncSetConfiguration(encoder, config); //应用设置

//计算PCM缓存所需大小以分配相应空间

mPCMBufferSize = inputSample * mPCMBitSize / 8;

mPCMBuffer = new char[mPCMBufferSize];

//开始编码

//判断pcm缓存区是否已满,如果没有,继续添加下一次数据,用mCountSize进行记数

int i,tmp;

if (mCountSize

{

memcpy(mPCMBuffer + mCountSize, src, srclen);

mCountSize += srclen;

}

else

{

mCountSize = 0; //缓存区已满,重置记数

unsigned char* aacData = new unsigned char[maxOutputBytes]; //编码后输出数据(也就是AAC数据)存放位置

//开始编码,encoder为编码器句柄,mPCMBuffer为PCM数据,inputSample为打开编码器时得到的输入样本数据

//aacData为编码后数据存放位置,maxOutputBytes为编码后最大输出字节数,ret为编码后数据长度

int ret = faacEncEncode(encoder, (int32_t *)mPCMBuffer, inputSample,aacData, maxOutputBytes);

//ret为0时不代表编码失败,而是编码速度较慢,导致缓存还未完全flush,可用一个循环继续调用编码接口,当 ret>0 时表示编码成功,且返回值为编码后数据长度

while (ret == 0)

{

ret = faacEncEncode(encoder, (int32_t *)mPCMBuffer, inputSample, aacData, maxOutputBytes);

}

if (ret > 0)

{

//AIPU_LOGD(_T("encode voice success !\n"));

//到这里已经编码成功,aacData为编码后数据

*dstlen=0;

tmp = ret;

for(i=0; i

{

dest[i] = aacData[i];

}

*dstlen = ret;

}

else

{

//AIPU_LOGE(_T("encode failed !\n"));

}

}

return 0;

}

 类似资料: