faad2是AAC音频解码的lib,支持MPEG2和MPEG4格式的audio解码。代码下载网址:https://www.linuxfromscratch.org/blfs/view/svn/multimedia/faad2.html。
解压:

tar xvzf faad2-2_10_0.tar.gz 
cd faad2-2_10_0/

./configure --host=mips-linux-gnu CC=mips-linux-uclibc-gnu-gcc --enable-shared --prefix=$(pwd)/install

make 

这里会出现一个错误,audio.c文件中没有frexp。这个函数是math.h中的函数,已经包含了这个头文件,还是提示错误, 估计指定编译器为uclibc。包含库不完整导致的。

注释掉 frexp函数相关语句可以通过编译。

make install

faad2库使用方法如下:

void *RX_Audio_Decode_Play_Thread(void *argv)
{VRbuf_s *RxAudioBuf;static unsigned char frame[FRAME_MAX_LEN];unsigned long samplerate;unsigned char channels;NeAACDecHandle decoder = 0;size_t size = 0;NeAACDecFrameInfo frame_info;unsigned char* pcm_data = NULL;//open decoderdecoder = NeAACDecOpen();RxAudioBuf= GetRxAudioStream();//从缓冲区中接收音频数据if(get_one_ADTS_frame(RxAudioBuf->buf, RxAudioBuf->len, frame, &size) < 0){printf("get_one_ADTS_frame file");return -1;}/************************************************get_one_ADTS_frame这里获取一帧数据是为了下面NeAACDecInit做准备。NeAACDecInit要输入一个size。 ************************************************///initialize decoderNeAACDecInit(decoder, frame, size, &samplerate, &channels);printf("samplerate %d, channels %d\n", samplerate, channels);Audio_Play_Initial();while(1){   RxAudioBuf= GetRxAudioStream();if(get_one_ADTS_frame(RxAudioBuf->buf, RxAudioBuf->len, frame, &size) == 0){pcm_data = (unsigned char*)NeAACDecDecode(decoder, &frame_info, frame, size); if(frame_info.error > 0){printf("%s\n",NeAACDecGetErrorMessage(frame_info.error));           }else if(pcm_data && frame_info.samples > 0){Audio_Play_Start(pcm_data,frame_info.samples * frame_info.channels);}       }DeleteAudioSream_List(RxAudioBuf);//删除这缓冲区}NeAACDecClose(decoder);Audio_Play_DeInitial();
}

下面来源网络。

faad2解码aac到pcm_深之JohnChen的专栏-CSDN博客_faad2

#include "AAC2PCM.h"
#include <stdio.h>
#include <memory.h>
#include "libsamplerate/samplerate.h"
#pragma comment(lib,"libfaad2/lib/libfaad2.lib")
#pragma comment(lib,"libsamplerate/libsamplerate.lib")
#define FRAME_MAX_LEN 1024*5
#define BUFFER_MAX_LEN 1024*1024static unsigned char frame[FRAME_MAX_LEN] = {0};
unsigned int framesize = FRAME_MAX_LEN;
//static unsigned char buffer[BUFFER_MAX_LEN] = {0};AAC2PCM::AAC2PCM(void)
{samplerate = 1;channels = 1;decoder = 0;m_nFirstPackageAccDataStatus = AccDataStatus_NotKnown;
}AAC2PCM::~AAC2PCM(void)
{
}/*** fetch one ADTS frame*/
int AAC2PCM::get_one_ADTS_frame(unsigned char* buffer, size_t buf_size, unsigned char* data ,size_t* data_size)
{size_t size = 0;if(!buffer || !data || !data_size ){return -1;}while(1){if(buf_size  < 7 ){return -1;}if ((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0)){// profile; 2 uimsbf// sampling_frequency_index; 4 uimsbf// private_bit; 1 bslbf// channel_configuration; 3 uimsbf// original/copy; 1 bslbf// home; 1 bslbf// copyright_identification_bit; 1 bslbf// copyright_identification_start; 1 bslbf// frame_length; 13 bslbfsize |= (((buffer[3] & 0x03)) << 11);//high 2 bitsize |= (buffer[4] << 3);//middle 8 bitsize |= ((buffer[5] & 0xe0) >> 5);//low 3bitprintf("len1=%x\n", (buffer[3] & 0x03));printf("len2=%x\n", buffer[4]);printf("len3=%x\n", (buffer[5] & 0xe0) >> 5);printf("size=%d\r\n", (int)size);break;}--buf_size;++buffer;}if(buf_size < size){return -1;}memcpy(data, buffer, size);*data_size = size;return 0;
}//初始化
int AAC2PCM::init(unsigned char defObjectType,unsigned long defSampleRate)
{m_nFirstPackageAccDataStatus = AccDataStatus_NotKnown;//open decoderdecoder = NeAACDecOpen();NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(decoder);/*conf->defObjectType = defObjectType;conf->defSampleRate = defSampleRate;conf->outputFormat = FAAD_FMT_16BIT ; //*/conf->defObjectType = LC;conf->defSampleRate = 8000; //real samplerate/2conf->outputFormat = FAAD_FMT_16BIT; //conf->dontUpSampleImplicitSBR = 1;unsigned char nRet = NeAACDecSetConfiguration(decoder, conf);m_bNeAACDecInit = false;return 0;
}//反初始化
int AAC2PCM::uninit()
{NeAACDecClose(decoder);return 0;
}//检测数据是否合法
int AAC2PCM::detectFirstPackageData(unsigned char* bufferAAC, size_t buf_sizeAAC)
{size_t size = 0;if(get_one_ADTS_frame(bufferAAC, buf_sizeAAC, frame, &size) < 0){m_nFirstPackageAccDataStatus = AccDataStatus_InValid;return -1;}m_nFirstPackageAccDataStatus  = AccDataStatus_Valid;return 0;
}//获取第一数据包状态
int AAC2PCM::getFirstPackageAccDataStatus()
{return m_nFirstPackageAccDataStatus;
}
//重置第一数据包状态
void AAC2PCM::clearFirstPackageAccDataStatus(int nAccDataStatus)
{m_nFirstPackageAccDataStatus = nAccDataStatus;
}//转换
int AAC2PCM::convert(unsigned char* bufferAAC, size_t buf_sizeAAC,unsigned char* bufferPCM, size_t & buf_sizePCM)
{if (m_nFirstPackageAccDataStatus != AccDataStatus_Valid)return -1;size_t size = 0;unsigned char* pcm_data = NULL;while(get_one_ADTS_frame(bufferAAC, buf_sizeAAC, frame, &size) == 0){// printf("frame size %d\n", size);//decode ADTS framepcm_data = (unsigned char*)NeAACDecDecode(decoder, &frame_info, frame, size);if(frame_info.error > 0){printf("%s\n",NeAACDecGetErrorMessage(frame_info.error));            return -1;}else if(pcm_data && frame_info.samples > 0){printf("frame info: bytesconsumed %d, channels %d, header_type %d\object_type %d, samples %d, samplerate %d\n", frame_info.bytesconsumed, frame_info.channels, frame_info.header_type, frame_info.object_type, frame_info.samples, frame_info.samplerate);buf_sizePCM = frame_info.samples * frame_info.channels;/*//从双声道的数据中提取单通道  for (int i = 0, j = 0; i<4096 && j<2048; i += 4, j += 2){bufferPCM[j] = pcm_data[i];bufferPCM[j + 1] = pcm_data[i + 1];}*/memcpy(bufferPCM,pcm_data,buf_sizePCM);}        bufferAAC -= size;buf_sizeAAC += size;}return 0;
}int AAC2PCM::convert2(unsigned char* bufferAAC, size_t buf_sizeAAC, unsigned char* bufferPCM, size_t & buf_sizePCM)
{unsigned char* pcm_data = NULL;if (!m_bNeAACDecInit){//initialize decoderNeAACDecInit(decoder, bufferAAC, buf_sizeAAC, &samplerate, &channels);printf("samplerate %d, channels %d\n", samplerate, channels);m_bNeAACDecInit = true;}//decode ADTS framepcm_data = (unsigned char*)NeAACDecDecode(decoder, &frame_info, bufferAAC, buf_sizeAAC);if (frame_info.error > 0){printf("%s\n", NeAACDecGetErrorMessage(frame_info.error));return -1;}else if (pcm_data && frame_info.samples > 0){printf("frame info: bytesconsumed %d, channels %d, header_type %d\object_type %d, samples %d, samplerate %d\n",frame_info.bytesconsumed,frame_info.channels, frame_info.header_type,frame_info.object_type, frame_info.samples,frame_info.samplerate);buf_sizePCM = frame_info.samples * frame_info.channels;/*//从双声道的数据中提取单通道  for (int i = 0, j = 0; i<4096 && i<buf_sizePCM && j<2048; i += 4, j += 2){bufferPCM[j] = pcm_data[i];bufferPCM[j + 1] = pcm_data[i + 1];}*/memcpy(bufferPCM,pcm_data,buf_sizePCM);/*float in[4096] = { 0 };float out[4096] = { 0 };for (int j = 0; j < 4096 && j < buf_sizePCM; j++){in[j] = pcm_data[j];}SRC_DATA dataResample;dataResample.data_in = in;dataResample.data_out = out;dataResample.input_frames = frame_info.samples;dataResample.output_frames = frame_info.samples;dataResample.src_ratio =  8000.0/frame_info.samplerate;int nRetResample = src_simple(&dataResample, SRC_SINC_FASTEST, 2);buf_sizePCM = dataResample.output_frames_gen * frame_info.channels;memcpy(bufferPCM, dataResample.data_out, buf_sizePCM);*/return 0;}return -1;
}

注意事项:
1,解码aac-解决采样频率和通道数不对的问题。

//防止采样频率加倍
NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(decoder);
conf->dontUpSampleImplicitSBR = 1;
NeAACDecSetConfiguration(decoder, conf);

//从双声道的数据中提取单通道  
for(i=0,j=0; i<4096 && j<2048; i+=4, j+=2)

{
frame_mono[j]=pcm_data[i];
frame_mono[j+1]=pcm_data[i+1];
}  
————————————————
版权声明:本文为CSDN博主「byxdaz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/byxdaz/article/details/53995837

君正T31 ACC解码相关推荐

  1. 君正 T31 真正能用的编译 Openssl 方法

    废话不多说,直接上方法: 解压 openssl 库文件 tar -xzf openssl-1.1.1l.tar.gz 提前准备好君正的交叉编译工具,我放的位置是:/opt/mips-gcc472-gl ...

  2. 君正Magik算法平台介绍

    ------------摘自君正官方<magik_introduce> 00 引言 君正简介,芯片 + AI 算力 + AI 开发平台」方案落地,公布全栈式低功耗 AI 技术 01 Mag ...

  3. 中国自主芯片厂商君正科技物联网IoT平台Halley2上的二维码识别

    斐泰科技发布的 FitQR PLus Decoding SDK 是业界第一款支持君正 Halley2 物联网(IoT)平台上二维码识别的商用软件开发包. Halley2核心板尺寸 26mm*37mm ...

  4. 君正x2000音视频多路编码实现

    准备资料 一.硬件资源 可以看到x2000是拥有2个ISP模块的. 选择通过ISP模块时,camera 设备节点名为 mscaler. 开启单摄时为 mscaler0 或 mscaler1,对应的是 ...

  5. 君正X2000多核理器数据手册

    X2000是君正面向商业市场推出的新一代多核异构跨界处理器产品.其CPU内核采用独特的双XBurst®2+ XBurst®0的三核结构.产品兼有应用处理器的出色算力和微控制器的实时控制.低功耗的特点. ...

  6. 三核异构,跨界处理新引擎—君正X2000 的跨界能力

    一. 概述 X2000 是北京君正公司推出的新一代 SoC 产品.该产品有诸多亮点,比如XBurst®2 的首次亮相.双 XBurst®2+ XBurst®0 的三核异构布局.符合IEEE1588-2 ...

  7. 君正Zeratul开发(5)——快速启动优化

    前言:   Camera 需要快速启动, 以第一时间抓拍到图像,君正官方给的第一帧图像是200ms,实际应用中时间会长不少. 1.尽快运行主程序  主程序应该放置在 rootfs 中并第一时间加载运行 ...

  8. 君正Zeratul开发(4)——图像效果调试

    前言   目前而言,君正设备的isp 图像效果还是君正的工程师在负责开发调试,如果需要添加一款新的摄像头,一般也是将新摄像头的驱动,从ISVP 版本移植到Zeratul平台.这里主要介绍:(1)摄像头 ...

  9. 君正Zeratul开发(2)——uboot启动分析

    前言    boot启动一般分为两个阶段,君正设备的第一阶段uboot spl 程序没有开源,用户编译的是第二阶段的boot,最后将两个阶段的boot合并到一起,写入到boot分区中去,boot分区如 ...

  10. 尴尬君正,是如何被“创新”带到沟里去的?

    作为创业板的一个标杆,北京君正(300223)上市快三年了.在上市三年之际,重新回顾梳理这样一家集"自主创新""高新科技企业""国产CPU" ...

最新文章

  1. 动软分享社区系统实现个性化导购营销平台
  2. Python_问题收录总结
  3. 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解
  4. 通信距离与哪些因素相关?为什么模块通信距离和厂家宣传的不一样?
  5. Android平滑移动——Scroller类研究
  6. js中文件写入(字符串写入)_note
  7. (源码实例)通过层DIV实现,当鼠标放在链接上面,显示图片及文字
  8. 【译】使用 CocoaPods 模块化iOS应用
  9. 做软件测试却不知道这些测试工具?利用好可以涨薪50%
  10. C语言数据结构——数组的定义与顺序存储
  11. 分享四款H5怀旧小游戏魔塔+伏魔记+三国霸业+寻仙纪
  12. Random随机数和for循环,实现猜数游戏和双色球
  13. js事件对象鼠标与键盘事件对象
  14. Excel辅助“校验”
  15. 程序员转项目管理,需要做什么?
  16. VMwarex虚拟机打不开:“指定的文件不是虚拟磁盘”
  17. TPSHOP商城软件测试环境搭建过程
  18. WC2015简短感想
  19. 酷酷资源社网站同款xiuno模板/知乎蓝魔改版源码/附多个插件
  20. 艺赛旗(RPA)国家企业信用信息公示系统验证码破解(二)

热门文章

  1. xml mysql 树形数据删除_使用递归删除树形结构的所有子节点(java和mysql实现)
  2. javaWeb基于SSM框架学生信息管理系统项目完整源码附带部署教程
  3. 视频教程-172集通俗易懂的C语言从入门到项目实战教程-C/C++
  4. 谈谈可视化编程 (转)
  5. 购物车html js代码,js实现购物车功能
  6. 教你怎么短期内备考并通过PMP考试!
  7. 自由职业者互联网进化记
  8. Python统计Java代码行数
  9. html自动留言,html 留言板
  10. 《高质量程序设计指南》读书笔记