#include #include #include "faad.h" #include #include #include #include #include #include #include bool hasInit = false; NeAACDecHandle decoder = 0; NeAACDecFrameInfo frame_info; void PrintArry(unsigned char *buffer, unsigned int size) { int i; char data[1024*1024]; for(i = 0;i < size;i++) { data[i] = buffer[i]; } data[i + 1] = '\0'; } int init_decoder(unsigned char* inBuffer, size_t size) { unsigned char channels; unsigned long sampleRate; memset(&frame_info, 0, sizeof(frame_info)); decoder = NeAACDecOpen(); NeAACDecInit(decoder, inBuffer, size, &sampleRate, &channels); //printf("init_decoder初始化完毕\n"); hasInit = true; return 0; } int feedData(unsigned char* out_data, unsigned char* buffer, unsigned int size) { int ret = 0; if (!hasInit) { init_decoder(buffer, size); } unsigned char *out_buffer = (unsigned char*)NeAACDecDecode(decoder, &frame_info, buffer, size); //printf("frame_info.error %d\n",frame_info.error); if (frame_info.error > 0) { return frame_info.error; } else if(out_buffer && frame_info.samples > 0)//解码成功 { ret = frame_info.samples * frame_info.channels; for(int i = 0;i < ret;i++) { out_data[i] = out_buffer[i]; } } return ret; } void destroyDecoder() { hasInit = false; NeAACDecClose(decoder); } /*bool GetFrame(FILE *file, unsigned char *input, int *len, int *pos) { int readByte; int frameLen = 0; unsigned char buffer[6]; while ((readByte = fread(buffer, 1, 6, file)) > 0) { if ((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0)) { frameLen = ((buffer[3] & 0x3) << 11) | ((buffer[4]) << 3) | ((buffer[5]) >> 5); printf("帧长度 %d\n", frameLen); *len = frameLen; fseek(file, *pos, SEEK_SET); fread(input, 1, frameLen, file); *pos = *pos + frameLen; return true; } else { printf("位置没找对\n"); } } return false; } int main(int argc, char* argv[]) { int len; int pos = 0; unsigned char buffer[4096] = {0}; unsigned char OutBuffer[10240]; unsigned char* pcmData = OutBuffer; FILE* file = fopen("test.aac", "rb"); if(!file) { printf("找不到AAC文件\n"); return -1; } outFile = fopen("shchu.pcm", "wb+"); while (GetFrame(file, buffer, &len, &pos)) { feed_data(pcmData, buffer, len); } fclose(file); fclose(outFile); destroy_decoder(); printf("解码完毕\n"); return 0; }*/