一:下载faac库
1:我已经修改各种错误后的源码 :faac-1.28源码,已解决编译错误,工具链aarch64-linux-gnu-已编译成功资源-CSDN文库
2:官方源码:
wget http://downloads.sourceforge.net/project/faac/faac-src/faac-1.28/faac-1.28.tar.gz
二:编译faac(官方源码)
tar zxvf faac-1.28.tar.gz
cd faac-1.28/
./configure --enable-share --host=arm-linux --prefix=/home/hfzuo/work/faac/_install CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++
make
make install
将动态库libfaac.so.0库拷贝到开发板即可
三:错误解决
1:错误:mpeg4ip.h:126:7: error: ambiguating new declaration of ‘char* strcasestr(const char*, const char*)’
char *strcasestr(const char *haystack, const char *needle);
解决办法:
从123行开始修改此文件mpeg4ip.h,到129行结束。
修改前:
#ifdef __cplusplus
extern "C" {
#endif
char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
修改后:
#ifdef __cplusplus
extern "C++" {
#endif
const char *strcasestr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
2:错误:
rtphint.cpp:345:22: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (pSlash != '\0') {
解决办法:if (pSlash != (char*)'\0')
四:编写代码pcm转aac
调用pcm_to_aac_init 初始化,然后循环调用pcm_to_aac即可完成转码
#include "faac.h"
#include <stdio.h>
#include "user_faac.h"
faacEncHandle hEncoder;
faacEncConfigurationPtr pConfiguration;
unsigned long nMaxOutputBytes = 0;
unsigned long nPCMBitSize = 16; // 单样本位数
unsigned long nInputSamples = 0;
void pcm_to_aac_init(void)
{
unsigned long nSampleRate = 48000; // 采样率
unsigned int nChannels = 2; // 声道数
hEncoder = faacEncOpen(nSampleRate, nChannels, &nInputSamples, &nMaxOutputBytes);
printf("XXXXXXXXXXnInputSamples=%lu,nMaxOutputBytes=%lu\r\n", nInputSamples, nMaxOutputBytes);
pConfiguration = faacEncGetCurrentConfiguration(hEncoder);
pConfiguration->aacObjectType = LOW; // 设置AAC类型
pConfiguration->useTns = 0;
pConfiguration->useLfe = 0; // 是否允许一个声道为低频通道
pConfiguration->outputFormat = 1; // RAW_STREAM = 0, ADTS_STREAM=1 (ADTS可以实现单帧单独解码,raw由于缺少头无法单帧解码,因此无法做实时传输)
// pConfiguration->bitRate =48000; //设置比特率
pConfiguration->inputFormat = FAAC_INPUT_16BIT; // 设置输入PCM格式
pConfiguration->mpegVersion = MPEG2;
// pConfiguration->bandWidth = 32000;
faacEncSetConfiguration(hEncoder, pConfiguration);
}
int pcm_to_aac(unsigned char *aac, unsigned char *pcm, int size)
{
return faacEncEncode(hEncoder, (int *)pcm, nInputSamples, aac, nMaxOutputBytes);
}
void pcm_to_aac_close(void)
{
faacEncClose(hEncoder);
}