- 浏览: 154180 次
- 性别:
- 来自: 北京
最新评论
-
cys1314:
java 实现的公式计算 -
qq408170918:
楼主 请问下 “zip压缩包式皮肤” 这个 要怎么解压 怎么读 ...
应用换肤实现思路总结 -
蕾恩love:
Exception in thread "main& ...
Hadoop远程开发 -
unimme:
刚刚接触Jetty收-藏-了
jetty嵌入式配置总结 -
liuxuejin:
demo在那里呢??
aac解码器之郁闷
aac解码器之郁闷(二)
- 博客分类:
- Android
扫盲
AAC实际上是高级音频编码的缩写,它是MPEG-2规范的一部分。但2000年,MPEG-4标准出台,AAC从新整合了其特性,故现又称 MPEG-4 AAC,即m4a。以上也就是说以.aac和.m4a结尾的都可以称为aac。
目前成熟的解码器
- opencore的opencore-aacdec
- ffmpeg 的aac解码器,当然还包括很多其他格式的音频视频解码器。
- faad 解码器
目的:把faad的aac解码器移植到android平台上来。
方法:参考demo移植解码器。
实现方式:
附上部分代码
首先定义结构体:
#define MAX_BUFFER 20480 //20K
#define MIN_BUFFER 2048 /* FAAD file buffering routines */ typedef struct { long bytes_into_buffer; long bytes_consumed; long file_offset; long size; unsigned char *buffer; int at_eof; FILE *infile; } aac_buffer; struct AACFileHandle { FILE* file;//文件 int size;//文件长度 int bitrate;//比特率 int samplerate;//抽样率 float duration;//播放时长 int channelNum;//声道数 int fileType;//文件类型(1:ADTS,2: ADIF) int mp4file; int track; long sampleId; mp4ff_t *infile; mp4AudioSpecificConfig *mp4ASC; mp4ff_callback_t *mp4cb; aac_buffer buffer;//aac缓存信息 NeAACDecHandle hDecoder; };
打开文件操作:
int mp4file = 0;
int index = findFreeHandle( ); if( index == -1 ) return -1; //取得文件全路径 const char* fileString = env->GetStringUTFChars(file, NULL); FILE* fileHandle = fopen( fileString, "rb" );//以只读的方式打开文件 env->ReleaseStringUTFChars(file, fileString);//释放文件路径 if( fileHandle == 0 )//如果打开文件失败返回-1 return -1; //*********************以上打开文件完毕******************************** AACFileHandle* aacHandle = new AACFileHandle(); if(aacHandle == NULL){ return -1; } memset(aacHandle, 0, sizeof(AACFileHandle)); //读取文件头,判断是否是MP4 unsigned char header[8]; fread(header, 1, 8, fileHandle); rewind(fileHandle); if (header[4] == 'f' && header[5] == 't' && header[6] == 'y' && header[7] == 'p') mp4file = 1; aacHandle->mp4file = mp4file; if (!mp4file){ if(open_aac_file(fileHandle, aacHandle) < 0) { fclose(fileHandle); delete aacHandle; return -1; } }else{//mp4 aac if(open_mp4_file(fileHandle, aacHandle) < 0) { fclose(fileHandle); delete aacHandle; return -1; } } handles[index] = aacHandle; // AACD_TRACE("index :" + index); return index;
解码操作:
AACD_TRACE("start"); //加传入参数的判断 if(aacHandle == NULL || size <=0){ //这部分返回0是因为外部判断的是0 return 0; } // size = size >>1; // if(fp == NULL) // { // fp = fopen("sdcard/temp222.wav", "a+b"); // } int pos =0; AACD_TRACE("read_aac_samples, isSeeking %d",isSeeking); jshort * target = env->GetShortArrayElements(buffer, NULL); if(aacHandle->buffer.bytes_into_buffer == 0) { fill_buffer(&aacHandle->buffer, 1); } int times = 0; void *sample_buffer = NULL; while(pos < size && aacHandle->buffer.bytes_into_buffer != 0){ if(isSeeking)return -1; NeAACDecFrameInfo frameInfo; sample_buffer = NeAACDecDecode(aacHandle->hDecoder, &frameInfo, aacHandle->buffer.buffer, aacHandle->buffer.bytes_into_buffer); if((frameInfo.error == 0) && (frameInfo.samples >= 0) && sample_buffer != NULL) { times++; if((pos + frameInfo.samples) > size){ AACD_TRACE("samples: %d, pos: %d, size %d", frameInfo.samples, pos, size); break; } aacHandle->sampleId += 1; // if(pos + frameInfo.samples < size){ // AACD_TRACE("samples %d", frameInfo.samples); // aacHandle->buffer.bytes_consumed = 0; memmove((void *)(target + pos), (void *)sample_buffer, sizeof(short) * frameInfo.samples); // memset(sample_buffer, 0, sizeof(short) * frameInfo.samples); pos += frameInfo.samples; advance_buffer(&aacHandle->buffer, frameInfo.bytesconsumed); fill_buffer(&aacHandle->buffer, 1); // }else{ // int othersize = 0; // unsigned long bytesconsumed = 0; // if(frameInfo.samples < (size -pos)){ // othersize = frameInfo.samples; // }else{ // othersize = (size -pos); // } // AACD_TRACE( "othersize %d", othersize); // memcpy((void *)(target + pos), (void *)sample_buffer, sizeof(short) * othersize); // advance_buffer(&aacHandle->buffer, frameInfo.bytesconsumed*othersize/size); // pos += othersize; // fill_buffer(&aacHandle->buffer); // AACD_TRACE( "decodingothers %d", frameInfo.samples); // break; // } } else if(frameInfo.error != 0){ AACD_TRACE("read error %d, consumed bytes: %d", frameInfo.error, frameInfo.bytesconsumed); advance_buffer(&aacHandle->buffer, frameInfo.bytesconsumed); if (frameInfo.bytesconsumed == 0) { fseek(aacHandle->buffer.infile,aacHandle->buffer.file_offset,SEEK_SET); aacHandle->buffer.bytes_into_buffer = 0; break; } // if(aacHandle->mp4file){ // mp4ff_set_sample_position(aacHandle->infile, aacHandle->track, aacHandle->sampleId); // } } } AACD_TRACE("times : %d, pos %d, size %d", times, pos, size); env->ReleaseShortArrayElements(buffer, target, 0); return times > 0 ? pos: -1;
发表评论
-
方便好用的自定义按钮按下效果
2013-07-01 12:08 1343public static StateListDrawabl ... -
分享一下
2013-03-08 17:43 1082http://www.cnblogs.com/DreamSea ... -
flash打包
2012-06-29 12:40 1336輕鬆學會用Adobe Flash ... -
Activity的启动模式(android:launchMode)
2012-05-16 10:31 1360standard 每次都会新建,每个Task都可以有, ... -
网上发现的3D Gallery效果
2012-04-10 16:19 1814看了看效果,跑了一下。感觉还不错。 作者不知道是谁了, ... -
报表,折线图
2012-04-10 13:14 1404前几天为了实现类window资源管理器的效果实现了这个折线图。 ... -
复合ListView
2012-04-10 13:11 1664前几天写的复杂ListView的实现方式。 使用的场景: ... -
View 3D旋转
2012-04-10 13:08 1537没事自己写的: package com.zgy.and ... -
取得系统支持的所有音频格式
2012-03-14 20:54 1238try { // Method method = Cla ... -
handler源码分析
2012-03-01 21:24 1558昨天研究了一下Handler的源码,今天总结一下: a ... -
很久发博客了,发个最近写的一个方法吧。
2012-01-05 22:08 1148/** * 设定按钮动作 * @param nor ... -
自定义绝对布局的实现
2012-01-05 22:01 2335android 绝对布局已经过期了为了保证稳定性自定义了一个绝 ... -
aac解码器之郁闷
2011-10-07 10:52 2482扫盲 AAC实际上是高级音频编码的缩写,它是M ... -
91手机助手、豌豆荚自动安装驱动实现方式技术调研总结
2011-07-30 23:37 7916本帖强烈要求扔砖头。 因为工作需要调研一下91手机助手 ... -
换肤实现思路(二)
2011-07-09 12:31 2451以前写过一个关于皮肤的换肤思路的博客。但那个里边主要是针对于资 ... -
ContentProvider的实现
2011-07-09 12:28 3325这几天有些忙,要做关于访问exchange服务器的技术调研,环 ... -
应用换肤实现思路总结
2011-07-01 23:14 3928注:以下所有言论纯属个人主观分析。 换肤解决方案:1. ... -
widget开发实例代码
2011-06-28 21:44 1652其实创建一个widget很简单。这里就做了一个简单的demo, ... -
android应用之--我的微博
2011-06-26 15:53 1524用了一个周六周日,做了一个简单的新浪微博。后续功能还要加入腾讯 ... -
androidpn的一次亲密接触(二)
2011-06-22 22:46 6357简单看了一下源码的实现,这里贴一点个人觉得比叫重要的代码。 ...
相关推荐
包含三个aac音频解码器,Directshow Filter文件,需要用DirectShow解码AAC音频,试试这几个吧。
最新aac解码器,想研究arm端aac编码的,请联系bj_zhang@aliyun.com
AAC编解码源码 AAC编解码源码 AAC编解码源码
安卓aac解码播放
一个效率很高的AAC编解码库 Fdk-aac相比 faac以及其他的aac库,好处是输出码率控制精准,而且支持he-aac的编解码
AAC解码算法原理, AAC文件格式, ISO MPEG AAC相关文档, MP4数据流封装的标准文档
aac音频解码器,可播放aac音频格式文件
在系统级高层C模型的基础上,提出了在低成本SoC平台的软件优化策略,包括基于统计分析...本文论述了优化的软硬件平台、优化方法和优化过程,并实现MPEG4 AAC的实时解码。结果证明了该优化策略在性能和成本方面的有效性。
aac音频压缩编解码源码 方便进行音频压缩,使用到mp4V2库,mp4av,mp4ff,这是包含SBR的最新AAC编解码算法
aac解码源码 项目所用代码偷传上来 能编译通过
本文详细介绍了符合ISO/IEC 13818-7(MPEG2 AAC audio codec) , ISO/IEC 14496-3(MPEG4 Audio Codec AAC Low Complexity)进行压缩的的AAC音频的解码算法。
aac-ld 解码实例 , 基于fdk-aac库 支持aac-ld格式 单声道和双声道的立体声
实现在linux下使用libfaad库将aac文件解码成pcm。具体请看压缩包中的readme。
iOS使用第三方库ffmpeg+fdk-aac进行编解码,包括音频和视频的编解码
AAC解码算法原理详解(附代码),并用 代码实现了,可运行
苹果公司关于AAC解码器的源码,关于esds音频字段的信息读取源代码
MPEG_2AAC音频解码器原型芯片设计与实现
AAC+SBR+PS解码器支持SBR和参数立体声解码的源码
一个使用faad库解码AAC的小程序,只能解码ADTS格式帧文件
采用C#包装解码AAC音频流,调用的解码库为faad2