1、AAC音频文件格式
(1) AAC的音频文件格式有ADIF & ADTS:
我主要做的是ADTS,我们就分析ADTS格式,下面的图可以反映问题。
可以参考:https://www.jianshu.com/p/b5ca697535bd
但是这里的ADTS Frame帧中AAC ES的大小不是固定的,这就造成每一帧ADTS数据大小都不同,可以是几百字节到一千多个字节。ADTS帧大小不同,FAAD库就为它设计了一个特别的解码函数,我们待会分析。
2、解码函数分析
unsigned long NEAACAPI NeAACDecGetCapabilities(void);
//这个函数是返回该函数库可以支持的文件格式
#define LC_DEC_CAP (1<<0) /* Can decode LC */
#define MAIN_DEC_CAP (1<<1) /* Can decode MAIN */
#define LTP_DEC_CAP (1<<2) /* Can decode LTP */
#define LD_DEC_CAP (1<<3) /* Can decode LD */
#define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */
#define FIXED_POINT_CAP (1<<5) /* Fixed point */
NeAACDecHandle NEAACAPI NeAACDecOpen(void);
//解码open函数,返回一个“解码器的头”,简单类比为open()函数返回的文件描述符fd
void NEAACAPI NeAACDecClose(NeAACDecHandle hDecoder);
//同样类比close()函数,输入的参数就是解码open函数,打开的“解码器头”
NeAACDecConfigurationPtr NEAACAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder);
//得到解码器的配置信息
unsigned char NEAACAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config);
//设置解码器信息,传入的就是配置信息
long NEAACAPI NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels);
//值得一说的是初始化函数,第一个“解码器的头”,
//重点:第二个“要解码的buffer”,这个buffer只要传一部分进行,初始化函数就会识别文件格式是ADTS还是ADIF
//第三个参数:buffer的大小
//第四采样率,第五通道数
void* NEAACAPI NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size);
//重点:是解码函数传进行的hInfo,这个作为输出型参数;
typedef struct NeAACDecFrameInfo
{
unsigned long bytesconsumed;
unsigned long samples;