faad解码aac
// 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的更多相关文章
- H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式(包含AAC部分解析)
H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +------------ ...
- 视音频编解码学习工程:AAC格式分析器
=====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...
- ffmpeg关于aac解码
ffmpeg从0.11.3版本开始,默认解码aac为AV_SAMPLE_FMT_FLT (float) 0.11.2以前版本解码aac为AV_SAMPLE_FMT_S16 (16位short型)
- (原)从mp4,flv文件中解析出h264和aac,送解码器解码失败
转载请注明出处:http://www.cnblogs.com/lihaiping/p/5285166.html 今天在做本地文件解码测试,发现从mp4,flv文件中读出来的帧数据,h264和aac帧直 ...
- (转) 解密H264、AAC硬件解码的关键扩展数据处理
出自:http://blog.itpub.net/30168498/viewspace-1576794/ 通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这 ...
- AAC 格式分析
一直在做一个语音项目,到了测试阶段,近来不是很忙,想把之前做的内容整理一下. 关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Au ...
- AAC音频格式详解
关于AAC音频格式基本情况,可参考维基百科http://en.wikipedia.org/wiki/Advanced_Audio_Coding AAC音频格式分析 AAC音频格式有ADIF和ADTS: ...
- C#音视频网络流解码:H264视频和ACC音频
下面两种方式是直接翻译过来的,还有问题,比如指针的使用和值的传入.考虑C#和C++的差异,还是要抱着怀疑的态度去看待,不一定是对的. H264视频解码网络流: using FFmpeg.AutoGen ...
- FLV提取AAC音频单独播放并实现可视化的频谱
如上图,要实现对FLV直播流中音频的识别,并展示成一个音频相关的动态频谱. 一. 首先了解下什么是声音? 能量波,有频率有振幅,频率高低就是音调,振幅大小就是音量:采样率是对频率采样,采样精度是对幅度 ...
随机推荐
- OpenGL Code Resources
https://www.opengl.org/wiki/Code_Resources http://ogldev.atspace.co.uk/
- JAVA属性和成员的可见性
- java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别
java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别 以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自 ...
- myeclipse工程当中的.classpath 和.project文件什么作用?
.project是项目文件,项目的结构都在其中定义,比如lib的位置,src的位置,classes的位置.classpath的位置定义了你这个项目在编译时所使用的$CLASSPATH .classpa ...
- yii2 Pjax的使用
有两个例子:刷新时间和数据显示排序 1.刷新时间 (1)控制器中的方法:Time public function actionTime() { return $this->render('tim ...
- 修改hosts
- linux安装-版本选择-终极决定
选用64位或32位的版本,注意看硬件: 内存大于4G的用64位, 小于4G的用32位 同时, 64位的版本在软件源, 软件的兼容性等问题. ----------------------------- ...
- 完全迁移到red hat来的相关问题解决和配置
默认从光盘iso镜像安装iso-1 时, yum.repos.d只有 packagekit-media.repo, 要从网上下载一个 CentOS-Base.repo文件放到这里. redhat上下载 ...
- js中的换算小技巧
之前自己一直使用~~运算符来把‘112222’字符型的数值换算成整型的数值 但今天调试程序发现了一些问题 ~~'999'=>999 ~~'111111999'=>111111999 这些都 ...
- Sphinx扩展安装安装
Coreseek官方教程中建议php使用直接include一个php文件进行操作,事实上php有独立的sphinx模块可以直接操作coreseek(coreseek就是sphinx!)已经进入了php ...