利用FAAC直接对PCM进行AAC编码
下面是我在faac fronted/main.c中抽出来 对PCM进行AAC编码的例子 希望对大家有用。
片源信息: output.pcm 44100 -2 -16
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <faac.h>
#define SIZE (4096*4)
void ShowConfig(faacEncConfigurationPtr config)
{
printf("version = %d \n",config->mpegVersion);
printf("aacObjectType = %d \n",config->aacObjectType);
printf("useTns = %d \n",config->useTns);
printf("allowMidside = %d \n",config->allowMidside);
printf("outputFormat = %d \n",config->outputFormat);
printf("inputFormat = %d \n",config->inputFormat);
}
int main()
{
unsigned long samplesInput, maxBytesOutput;
unsigned long rate =44100 ;
unsigned int channels = 2 ;
int len;
faacEncConfigurationPtr config;
faacEncHandle aacencoder ;
int inputBuffer[SIZE];
unsigned char outputBuffer[SIZE] ;
int bufferSize =SIZE;
FILE *fp ;
FILE *aac;
fp = fopen("output.pcm","rb");
if(!fp)
{
printf("open file error \n");
return -1 ;
}
aac = fopen("a.aac","wb");
if(!aac)
{
printf("create aac file error \n");
return -1 ;
}
aacencoder = faacEncOpen(rate,channels,&samplesInput,&maxBytesOutput) ;
if(samplesInput*channels*2>SIZE)
{
printf("please extented the SIZE macro \n");
return -2;
}
config = faacEncGetCurrentConfiguration(aacencoder);
ShowConfig(config);
config->version = 1;//MPEG2;
config->outputFormat =1;// ADTS_STREAM;
config->inputFormat = 1;// FAAC_INPUT_16BIT;
config->aacObjectType = 2;//LOW;
config->useTns = 0;//DEFAULT_TNS;
config->shortctl = 0;//SHORTCTL_NORMAL;
config->allowMidside = 1 ;
faacEncSetConfiguration(aacencoder, config);
ShowConfig(config);
printf("start encodeing process \n");
while(1)
{
memset(outputBuffer,0,sizeof(outputBuffer));
//这里每读取samplesInput*channels个字节,而不是samplesInput*channels*(16/8)
//16位采样位数,前面已设置 config->inputFormat = 1;// FAAC_INPUT_16BIT;
int ret = fread(inputBuffer,1,samplesInput*channels,fp);
if(ret <samplesInput)
{
printf("reach the end of file \n");
break;
}
len = faacEncEncode(aacencoder, inputBuffer,samplesInput,outputBuffer,bufferSize);
if(len<0)
{
printf("encoder aac error \n");
return -3;
}
fwrite(outputBuffer,1,len,aac);
}
faacEncClose(aacencoder);
fclose(fp);
fclose(aac);
return 0;
}