概述
在上一节中,我们给出了君正底层API接口的公共基类。但要实现这些公共基类的T31、T40、T41派生类,我们还有事情没有做:那就是封装ADPCM_DVI、AAC等编解码算法。ADPCM_DVI比较简单,网络上一般都能找到开源代码。AAC一般采用FDK AAC开源代码来实现,对FDK AAC开源代码进行二次封装即可。
ADPCM_DVI编解码
ADPCM,英文全称为Adaptive Differential Pulse Code Modulation,中文为自适应差分脉冲编码调制。
我们知道,音频信号虽然是比较连续的,但有些差值比较小,有些差值比较大。如果差值比较大,有可能用4bit表示不了。如果增大表示差值的位数,是可以解决这个问题的。但这也会导致数据量变大,没起到压缩的目的;另外,这种差值比较大的只是少数,大部分还是差值比较小的。
为了解决这个问题,研究人员就提出了ADPCM:定义一个因子,用差值除以因子的值来表示两点之差;如果两点之间差值比较大,则因子也比较大。通过因子引入,可以自动适应差值比较大的数据。
ADPCM DVI编解码的头文件AdpcmCodec.h如下。
#pragma once#ifdef __cplusplus
extern "C"
{
#endifstruct adpcm_state
{short valprev; /* Previous output value */char index; /* Index into stepsize table */
};