// faad2.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <cassert>
#include <iostream>
#pragma comment(lib, "libfaad2.lib")
#include <stdio.h>
#include <memory.h>
#include <string>
//#ifdef UNICODE
//typedef std::wstring _tstring;
//#else
//typedef std::string _tstring;
//#endif
#include <faad.h>
#include "WavMaker1.h"
const unsigned int g_frmMaxLen = 1024 * 5;
const unsigned int g_BufMaxLen = 1024 * 2048;//1024 * 1024 /**
* fetch one ADTS frame
* buffer 传递的是指针而不是指针的引用真是非常巧妙的一种方式.
*/
int 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 )
{
assert(0);
return -1;
}
while(1)
{
if(buf_size < 7 )
{
assert(0);
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 bslbf
size |= ((buffer[3] & 0x03) <<11); //high 2 bit
size |= buffer[4]<<3; //middle 8 bit
size |= ((buffer[5] & 0xe0)>>5); //low 3bit
break;
}
--buf_size;
++buffer;
} if(buf_size < size)
{
return -1;
} memcpy(data, buffer, size);
*data_size = size; return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
static unsigned char aacFrm[g_frmMaxLen]; //aac 最大帧长
static unsigned char buffer[g_BufMaxLen]; //截取 aac文件的最大长度 string src_file = "mp410.AAC";//输入文件
string dst_file = "mp410.wav";//输出文件
FILE* ifile = NULL; unsigned long samplerate = 0;
unsigned char channels = 0;
NeAACDecHandle decoder = 0;
size_t data_size = 0;
size_t size = 0; NeAACDecFrameInfo frame_info;
memset(&frame_info, 0, sizeof(frame_info));
unsigned char* input_data = buffer;
unsigned char* pcm_data = NULL; ifile = fopen(src_file.c_str(), "rb"); //打开输入文件
const char* p = dst_file.c_str();
WavMaker WavFile(p);
if(!ifile)
{
assert(0);
printf("source or destination file");
return -1;
} //* 读取AAC文件.
data_size = fread(buffer, 1, g_BufMaxLen, ifile); //读取AAC文件长度
//* 打开解码器
decoder = NeAACDecOpen();
//* 初始化解码器
if(get_one_ADTS_frame(buffer, data_size, aacFrm, &size) < 0)
{
assert(0);
return -1;
}
NeAACDecInit(decoder, aacFrm, size, &samplerate, &channels);
printf("samplerate %d, channels %d\n", samplerate, channels);
//* 初始化Wav结构
//WAVEFORMATEX fmt;
//fmt.wFormatTag = WAVE_FORMAT_PCM;
//fmt.nChannels = channels;
//fmt.nSamplesPerSec = samplerate;
//fmt.wBitsPerSample = 16;
//fmt.nBlockAlign = fmt.nChannels * fmt.wBitsPerSample /8;
//fmt.nAvgBytesPerSec = fmt.nBlockAlign * samplerate;
//fmt.cbSize = 0;
//ofile.Init(fmt);
//* 循环解码,写文件 while(get_one_ADTS_frame(input_data, data_size, aacFrm, &size) == 0)
{
pcm_data = (unsigned char*)NeAACDecDecode(decoder, &frame_info, aacFrm, size); //解码信息在frame_info if(frame_info.error > 0)
{
std::cout<<NeAACDecGetErrorMessage(frame_info.error)<<std::endl;
}
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);
WavFile.writebody(pcm_data, frame_info.samples * frame_info.channels );//may be 有问题
}
data_size -= size;
input_data += size;
}
NeAACDecClose(decoder);
fclose(ifile);
WavFile.writeheader(frame_info.channels,frame_info.samplerate);
WavFile.closeFile();
return 0;
}

faad解码aac的更多相关文章

  1. H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式(包含AAC部分解析)

    H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +------------ ...

  2. 视音频编解码学习工程:AAC格式分析器

    =====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...

  3. ffmpeg关于aac解码

    ffmpeg从0.11.3版本开始,默认解码aac为AV_SAMPLE_FMT_FLT (float) 0.11.2以前版本解码aac为AV_SAMPLE_FMT_S16 (16位short型)

  4. (原)从mp4,flv文件中解析出h264和aac,送解码器解码失败

    转载请注明出处:http://www.cnblogs.com/lihaiping/p/5285166.html 今天在做本地文件解码测试,发现从mp4,flv文件中读出来的帧数据,h264和aac帧直 ...

  5. (转) 解密H264、AAC硬件解码的关键扩展数据处理

    出自:http://blog.itpub.net/30168498/viewspace-1576794/       通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这 ...

  6. AAC 格式分析

    一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下. 关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Au ...

  7. AAC音频格式详解

    关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音频格式分析 AAC音频格式有ADIF和ADTS: ...

  8. C#音视频网络流解码:H264视频和ACC音频

    下面两种方式是直接翻译过来的,还有问题,比如指针的使用和值的传入.考虑C#和C++的差异,还是要抱着怀疑的态度去看待,不一定是对的. H264视频解码网络流: using FFmpeg.AutoGen ...

  9. FLV提取AAC音频单独播放并实现可视化的频谱

    如上图,要实现对FLV直播流中音频的识别,并展示成一个音频相关的动态频谱. 一. 首先了解下什么是声音? 能量波,有频率有振幅,频率高低就是音调,振幅大小就是音量:采样率是对频率采样,采样精度是对幅度 ...

随机推荐

  1. sql FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  2. Haproxy安装配置及日志输出问题

    简介: 软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载 ...

  3. Python之路【第十五篇】WEB框架

    WEB框架本质 Python的WEB框架分为两类: 1.自己写socket,自己处理请求 2.基于wsgi(Web Server Gateway Interface WEB服务网关接口),自己处理请求 ...

  4. Effective Objective-C 2.0 — 第11条:理解 objc_msgSend 的作用

    消息由接受者.选择子及参数构成.给某对象“发送消息” (invoke a message) 也就相当于在该对象上“调用方法”(call a method) 发给某对象的全部信息都要由“动态消息派发系统 ...

  5. 409. Longest Palindrome

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

  6. 使用Fluent API 配置/映射属性和类型

    Code First约定-Fluent API配置 使用Fluent API 配置/映射属性和类型 简介 通常通过重写派生DbContext 上的OnModelCreating 方法来访问Code F ...

  7. python快排算法

    通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. ...

  8. Asp.Mvc中的text实现 辅助用户输入 灰色字体

    在开发Web应用程序中经常需要用户在文本框输入信息,为了提高程序人性化设置以及用户体验效果常常需要在文本框中显示灰色字体辅助用户输入 如:

  9. LINUX系统知识(转)

    原文链接:http://blog.chinaunix.net/uid-725717-id-2060377.html 在Linux上配置好svnserve,通过eclipse访问,实现版本控制.但是开启 ...

  10. 浏览器内核与js引擎

    摘要: 面试一个大公司的时候问到了一个问题,让我谈谈主要的浏览器内核以及他们的特点,当时并没有详细的回答,回来之后自己在网上找了找资料,总结了下分享给大家. 简介: 在维基百科上是这样介绍浏览器内核的 ...