faad解码aac

时间:2022-11-07 08:38:07
// 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&period;264 RTPpayload 格式------ H&period;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. &lpar;原&rpar;从mp4&comma;flv文件中解析出h264和aac&comma;送解码器解码失败

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

  5. &lpar;转&rpar; 解密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&num;音视频网络流解码:H264视频和ACC音频

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

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

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

随机推荐

  1. 第二章 XHTML 基础

    元素与标签术语,HTML/XHTMLXHTML之间的联系区别在XHTML中,所有元素之间必须完成正确的嵌套,元素必须是闭合的,必须小写.必须有个跟元素HTML. 标题标<h1>语法:&lt ...

  2. 淘宝业务常用english

    ADX        ad exchange 广告交易平台 coupon     赠品 CPC         cost per click CPS         cost per sales CT ...

  3. 【张泽华】android视频教程下载地址及上课源代码

    http://note.youdao.com/share/?id=f39bf918842c7b0673a033d35d734073&type=notebook#/1AC357745ED74BC ...

  4. &lbrack;RxJS&rsqb; Updating Data with Scan

    You often need to update the data flowing through the stream with custom logic based on what you nee ...

  5. 【转】【Android】HAL分析

    原文网址:http://www.cnblogs.com/lcw/p/3335505.html HAL概述 以下是基于android4.0.3,对应其他低版本的代码,可能有所差异,但基本大同小异. An ...

  6. 系统学习Linux的11点建议

    一.从基础开始 常常有些朋友在 Linux 论坛问一些问题,不过,其中大多数的问题都是很基础的.例如为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不 ...

  7. 网络1711-1712的C语言作业总结(2017-2018第一学期)

    1.第0次作业总结--预备作业 作业地址 1711班级总结 1712班级总结 2.第一次作业总结--顺序结构 作业地址 1711班级总结 1712班级总结 3.第二次作业总结--分支结构 作业地址 1 ...

  8. antd中按需加载使用react-app-rewired报错

    [描述] 按照antd官网步骤 https://ant.design/docs/react/use-with-create-react-app-cn 最后yarn start会报错 [解决方法] 原因 ...

  9. MYSQL HA 部署手册

    1 MySQL启用主主双写复制 1.1 卸载系统默认的数据库mariadb 安装mysql出现安装包不兼容问题,首先卸载掉系统自带mariadb 查看已经安装的mariadb rpm -qa|grep ...

  10. linux 查看TCP端口

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ netstat –nat