用faad解码AAC(ADTS封装)
2015-12-16 09:33
603 查看
转自 :http://blog.csdn.net/gavinr/article/details/6959198
一个小程序,使用faad解码AAC音频,只能解码ADTS封装的帧。编译好的程序可以从这里下载:http://download.csdn.net/detail/gavinr/3782154
[cpp] view
plaincopyprint?
/**
* faaddec.c
* use faad library to decode AAC, only can decode frame with ADTS head
*/
#include <stdio.h>
#include <memory.h>
#include "faad.h"
#define FRAME_MAX_LEN 1024*5
#define BUFFER_MAX_LEN 1024*1024
void show_usage()
{
printf("usage\nfaaddec src_file dst_file");
}
/**
* fetch one ADTS frame
*/
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 )
{
return -1;
}
while(1)
{
if(buf_size < 7 )
{
return -1;
}
if((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0) )
{
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 main(int argc, char* argv[])
{
static unsigned char frame[FRAME_MAX_LEN];
static unsigned char buffer[BUFFER_MAX_LEN] = {0};
char src_file[128] = {0};
char dst_file[128] = {0};
FILE* ifile = NULL;
FILE* ofile = NULL;
unsigned long samplerate;
unsigned char channels;
NeAACDecHandle decoder = 0;
size_t data_size = 0;
size_t size = 0;
NeAACDecFrameInfo frame_info;
unsigned char* input_data = buffer;
unsigned char* pcm_data = NULL;
//analyse parameter
if(argc < 3)
{
show_usage();
return -1;
}
sscanf(argv[1], "%s", src_file);
sscanf(argv[2], "%s", dst_file);
ifile = fopen(src_file, "rb");
ofile = fopen(dst_file, "wb");
if(!ifile || !ofile)
{
printf("source or destination file");
return -1;
}
data_size = fread(buffer, 1, BUFFER_MAX_LEN, ifile);
//open decoder
decoder = NeAACDecOpen();
if(get_one_ADTS_frame(buffer, data_size, frame, &size) < 0)
{
return -1;
}
//initialize decoder
NeAACDecInit(decoder, frame, size, &samplerate, &channels);
printf("samplerate %d, channels %d\n", samplerate, channels);
while(get_one_ADTS_frame(input_data, data_size, frame, &size) == 0)
{
// printf("frame size %d\n", size);
//decode ADTS frame
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)
{
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);
fwrite(pcm_data, 1, frame_info.samples * frame_info.channels, ofile); //2个通道
fflush(ofile);
}
data_size -= size;
input_data += size;
}
NeAACDecClose(decoder);
fclose(ifile);
fclose(ofile);
return 0;
}
一个小程序,使用faad解码AAC音频,只能解码ADTS封装的帧。编译好的程序可以从这里下载:http://download.csdn.net/detail/gavinr/3782154
[cpp] view
plaincopyprint?
/**
* faaddec.c
* use faad library to decode AAC, only can decode frame with ADTS head
*/
#include <stdio.h>
#include <memory.h>
#include "faad.h"
#define FRAME_MAX_LEN 1024*5
#define BUFFER_MAX_LEN 1024*1024
void show_usage()
{
printf("usage\nfaaddec src_file dst_file");
}
/**
* fetch one ADTS frame
*/
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 )
{
return -1;
}
while(1)
{
if(buf_size < 7 )
{
return -1;
}
if((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0) )
{
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 main(int argc, char* argv[])
{
static unsigned char frame[FRAME_MAX_LEN];
static unsigned char buffer[BUFFER_MAX_LEN] = {0};
char src_file[128] = {0};
char dst_file[128] = {0};
FILE* ifile = NULL;
FILE* ofile = NULL;
unsigned long samplerate;
unsigned char channels;
NeAACDecHandle decoder = 0;
size_t data_size = 0;
size_t size = 0;
NeAACDecFrameInfo frame_info;
unsigned char* input_data = buffer;
unsigned char* pcm_data = NULL;
//analyse parameter
if(argc < 3)
{
show_usage();
return -1;
}
sscanf(argv[1], "%s", src_file);
sscanf(argv[2], "%s", dst_file);
ifile = fopen(src_file, "rb");
ofile = fopen(dst_file, "wb");
if(!ifile || !ofile)
{
printf("source or destination file");
return -1;
}
data_size = fread(buffer, 1, BUFFER_MAX_LEN, ifile);
//open decoder
decoder = NeAACDecOpen();
if(get_one_ADTS_frame(buffer, data_size, frame, &size) < 0)
{
return -1;
}
//initialize decoder
NeAACDecInit(decoder, frame, size, &samplerate, &channels);
printf("samplerate %d, channels %d\n", samplerate, channels);
while(get_one_ADTS_frame(input_data, data_size, frame, &size) == 0)
{
// printf("frame size %d\n", size);
//decode ADTS frame
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)
{
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);
fwrite(pcm_data, 1, frame_info.samples * frame_info.channels, ofile); //2个通道
fflush(ofile);
}
data_size -= size;
input_data += size;
}
NeAACDecClose(decoder);
fclose(ifile);
fclose(ofile);
return 0;
}
相关文章推荐
- @ResponseBody & @RequestBody
- Java中注解的工作原理
- 用Ant实现Java项目的自动构建和部署
- Sublime Text2安装_注册_使用_技巧
- 怎么做到不加班?
- Java常用日志框架及实现
- Android传感器编程带实例
- linux中fork()函数详解
- 单例模式学习
- delphi 屏蔽任务栏,屏蔽热键
- python连接Mysql操作
- 面向对象(二) 继承/里氏替换
- javascript针对不确定函数的执行方法
- STYLE设计经验摘记
- Assembly x64 Intro - SSE2 Copy8Times
- traceroute命令
- Android源码之陌陌项目源码
- OC_01
- ActiveMQ入门实例
- 它们的定义AlertDialog(二)