以下是关于fdk-aac使用方法的介绍,希望能对大家有所帮助,感谢观看。
1、 相较于faac及其他AAC编码库,fdk-aac在输出码率控制方面更为精确,且支持HE-AAC编解码功能。通过查阅Android源码发现,系统中OpenMax的软编码AAC组件正是基于fdk-aac实现,体现了其在移动平台上的广泛应用与良好兼容性,具备较高的实用价值和技术优势。
2、 解码器主要支持两种工作模式:RAW和ADTS。在使用RAW模式时,需在初始化阶段传入AudioSpecInfo参数,明确指定即将输入的原始音频数据的采样率、声道数等信息;同时,在送入音频数据前,必须先移除原有的ADTS头部信息。例如,可通过调用aacDecoder_Open函数并传入TT_MP4_RAW类型及通道数量来打开解码器实例,如m_hAacDecoder = aacDecoder_Open(TT_MP4_RAW, 1),完成解码器的初始化配置,为后续的裸流数据解码做好准备。
3、 在ADTS模式下,初始化解码器时无需提供音频规格信息,调用aacDecoder_Open时指定TT_MP4_ADTS类型并设置声道数为1。数据传输前需确保每帧音频数据包含完整的ADTS头部信息,用于标识帧长度、采样率、通道数等关键参数,以保证正确解析和播放音频流。
4、 在传输数据时,通常采用以下方式处理:首先定义一个无符号整型变量 bytesValid,并将其初始化为输入数据的大小 lInSize。随后进入循环,条件为 bytesValid 大于零且解码错误状态 decoderErr 等于 AAC_DEC_NOT_ENOUGH_BITS,表示当前仍有未处理的数据且因位流不足导致解码未完成。在循环体内,调用 aacDecoder_Fill 函数,将待解码的数据缓冲区 pIn 及其长度信息传入解码器,该函数会尝试填充解码器所需的位流数据,并更新已使用和剩余的有效字节数。紧接着,调用 aacDecoder_DecodeFrame 函数执行帧解码操作,将解码后的音频样本写入 m_decodeBuffer 缓冲区,设定最大输出缓冲区大小为 m_decodeBufSize,并以非阻塞模式运行。整个过程持续进行,直到所有输入数据被处理完毕或解码成功完成,确保数据流能够被逐步解析并输出连续的PCM音频帧。
5、 解码库在运行过程中会分配一个临时的内部输入缓冲区,该缓冲区的大小由宏定义 TRANSPORTDEC_INBUF_SIZE 决定。此值虽可自定义,但必须满足两项基本要求:其一,每个输入声道需占用 768 字节空间;其二,整个缓冲区的总容量必须为 2 的幂次方(即 2^n 字节)。例如,在处理立体声信号时,包含左右两个声道,所需最小空间为 2 × 768 = 1536 字节。然而,1536 并非 2 的幂,因此需向上取整至最近的符合条件的数值,即 2048 字节。故在此场景下,TRANSPORTDEC_INBUF_SIZE 应设为 2048。这种设计既保证了各声道数据有足够的存储空间,又确保缓冲区大小符合内存对齐和系统性能优化的要求。通过合理设置该参数,可在不同声道配置下实现高效、稳定的音频解码处理,避免因缓冲区不足或不规则尺寸引发的数据溢出或访问效率下降问题。
6、 aacDecoder_Fill 的作用是将输入缓冲区中的数据复制到解码器内部的缓冲区,执行完成后返回输入缓冲区中尚未被复制的数据量(以字节为单位)。而 aacDecoder_DecodeFrame 则负责对内部缓冲区中的数据进行解码操作。若内部缓冲区的数据不足,无法完成一次完整的帧解码,则该函数会因缺乏足够数据而无法输出有效音频帧,需等待更多数据填入后再行处理。两个函数协同工作,确保数据流连续且解码顺利进行。
