编码分类
根据编码方式的不同,音频编码技术分为三种:波形编码、参数编码和混合编码。一般来说,波形编码的话音质量高,但编码速率也很高;参数编码的编码速率很低,产生的合成语音的音质不高;混合编码使用参数编码技术和波形编码技术,编码速率和音质介于它们之间。
1、波形编码
波形编码是指不利用生成音频信号的任何参数,直接将时间域信号变换为数字代码,使重构的语音波形尽可能地与原始语音信号的波形形状保持一致。波形编码的基本原理是在时间轴上对模拟语音信号按一定的速率抽样,然后将幅度样本分层量化,并用代码表示。
波形编码方法简单、易于实现、适应能力强并且语音质量好。不过因为压缩方法简单也带来了一些问题:压缩比相对较低,需要较高的编码速率。一般来说,波形编码的复杂程度比较低,编码速率较高、通常在16 kbit/s以上,质量相当高。但编码速率低于16 kbit/s时,音质会急剧下降。
最简单的波形编码方法是PCM(Pulse Code Modulation,脉冲编码调制),它只对语音信号进行采样和量化处理。优点是编码方法简单,延迟时间短,音质高,重构的语音信号与原始语音信号几乎没有差别。不足之处是编码速率比较高(64 kbit/s),对传输通道的错误比较敏感。
2、参数编码
参数编码是从语音波形信号中提取生成语音的参数,使用这些参数通过语音生成模型重构出语音,使重构的语音信号尽可能地保持原始语音信号的语意。也就是说,参数编码是把语音信号产生的数字模型作为基础,然后求出数字模型的模型参数,再按照这些参数还原数字模型,进而合成语音。
参数编码的编码速率较低,可以达到2.4 kbit/s,产生的语音信号是通过建立的数字模型还原出来的,因此重构的语音信号波形与原始语音信号的波形可能会存在较大的区别、失真会比较大。而且因为受到语音生成模型的限制,增加数据速率也无法提高合成语音的质量。不过,虽然参数编码的音质比较低,但是保密性很好,一直被应用在军事上。典型的参数编码方法为LPC(Linear Predictive Coding,线性预测编码)。
3、混合编码
混合编码是指同时使用两种或两种以上的编码方法进行编码。这种编码方法克服了波形编码和参数编码的弱点,并结合了波形编码高质量和参数编码的低编码速率,能够取得比较好的效果。
音频编码技术的比较
按波形编码、参数编码和混合编码三类编码技术分类,从编码速率(码率)、语音质量和应用领域方面比较一些典型的编码方法,具体参见下表。
表 1 典型音频编码技术比较
编码技术 | 算法 | 编码标准 | 码率(kbit/s) | 质量 | 应用领域 |
波形编码 | PCM | G.711 | 64 | 4.3 | PSTN、ISDN |
ADPCM | G.721 | 32 | 4.1 | - | |
SB-ADPCM | G.722 | 64/56/48 | 4.5 | - | |
参数编码 | LPC | - | 2.4 | 2.5 | 保密语音 |
混合编码 | CELPC | - | 4.8 | 3.2 | - |
VSELPC | GIA | 8 | 3.8 | 移动通信、语音信箱 | |
RPE-LTP | GSM | 13.2 | 3.8 | - | |
LD-CELP | G.728 | 16 | 4.1 | ISDN | |
MPE | MPE | 128 | 5.0 | CD |
说明:质量评价共五个等级(1、2、3、4、5),其中5.0为最高分。
上表中各种算法、应用领域中缩略语的中文和英文全称参见下面说明。
PCM:Pulse Code Modulation,脉冲编码调制。
ADPCM:Adaptive Differential Pulse Code Modulation,自适应差分脉冲编码调制。
SB-ADPCM:Subband Adaptive Differential Pulse Code Modulation,子带-自适应差分脉冲编码调制。
LPC:Linear Predictive Coding,线性预测编码。
CELPC:Code Excited Linear Predictive Coding,码激励线性预测编码。
VSELPC:Vector Sum Excited Linear Predictive Coding,矢量和激励线性预测编码。
RPE-LTP:Regular Pulse Excited-Long Term Predictive,规则脉冲激励长时预测。
LD-CELP:Low Delay-Code Excited Linear Predictive,低时延码激励线性预测。
MPE:Multi-Pulse Excited,多脉冲激励。
PSTN:Public Switched Telephone Network,公共交换电话网。
ISDN:Integrated Services Digital Network,综合业务数字网。
音频时间戳计算
音频相对来说更难理解一些,因为音频的一个packet不止一帧,所以一秒到底有多少个packet就不知道,就别说如何计算pts了。假设音频一秒有num_pkt个packet,那么这个num_pkt到底是多少?
这的从音频基础开始说起,我们知道音频有个采样率,就是一秒钟采用多少次,很多音频都是44100的采样率,也有8k的,那么这个采样率和num_pkt有什么关系呢?
我们发现在AVFrame中有一个比较重要的字段叫做nb_samples,这个字段名为采样数,此字段可以结合音频数据格式计算这个frame->data有多大,其实这个字段联合采样率还可以计算音频一秒有多少个packet。
计算公式如下:
num_pkt = 采样率 / nb_samples;
这样我们就知道了音频每秒的包数目(可以见到理解为帧),有了此数据计算pts就和视频一模一样了,
计算公式如下:
第n个包的pts = n * ((1 / timbase)/ num_pkt);
很多音频时间基和采样率成倒数,那么根据公式我们的音频pts就可以很简单的以nb_samples递增了,如下:
第一个包:pts = 0 * nb_samples;
第二个包:pts = 1 * nb_samples;
第三个包:pts = 2 * nb_samples;
.
第n个包:pts = (n - 1) * nb_samples;
mp3的sample
为1152,
当aac编码级别是LC时frame_size 和nb_samples是1024,如果是HE的时候是2048。
混音方法:
1、线性叠加后求平均
优点:不会产生溢出,噪音较小;
缺点:衰减过大,影响通话质量;
short remix(short buffer1,short buffer2)
{
int value = buffer1 + buffer2;
return (short)(value/2);
}