随着语音压缩技术的成熟,网络带宽的不断扩展,以及市场的需求,IP电话技术已被从实验室中推向了成熟的商用领域。然而,要想把此种技术推向商用,就不得不重视安全问题。IP电话的监控和管理是VoIP(Voice over IP)安全领域中非常重要的部分,其中的一项关键技术就是IP电话语音还原技术。IP电话语音还原技术是对IP电话语音捕获系统捕捉的语音数据包进行处理,最终还原双方语音通话过程的技术。
VoIP系统音频数据传输过程如图1所示。在通过呼叫控制信令(如H.323、SIP)建立起两个终端之间的媒体流通道后,便开始了两个终端之间的语音传递过程。整个过程始于对模拟音频的模数转换,经过抽样、量化、编码生成的原始PCM 数据再经过音频编码器的压缩编码生成待传送的音频数据,通过RTP、UDP、IP协议的层层封装生成包含有音频抽样信息的IP报文发送到接收终端。接收端接收到含有音频数据的IP报文取出RTP净荷中的音频数据,送入相应的解码器解码,然后通过音频设备进行数模转换,回放出原始的声音。
我们所要研究的内容就是如何通过处理和解析RTP协议数据包,按照正确的顺序取出RTP净荷,如何对RTP净荷进行解码生成.wav文件,以及如何把两路.wav文件合成为一个包含两路会话内容的.wav文件。
1 RTP数据的处理
RTP数据指的是由IP电话语音捕获器捕捉并记录下来的语音会话当中传送的RTP数据报文的集合,如文件、数据库记录等。以一次通话过程为例,IP电话语音捕捉器将分别生成两个独立的记录有双方通话内容的RTP数据集,记为forward—RTP和reverseRTP,这就是一次处理过程中待处理的数据源。
RTP数据的处理总体上分为两个部分:排序处理和补包处理。
1.1 排序处理
由于网络传输存在一定的不可靠性,在数据传输的过程中有可能会导致数据包到达顺序的局部混乱,通过排序将很好地解决这个问题。
从RTP协议来看,可以用于进行排序的域有两个,即序列号和时间戳。在没有出现乱序的情况下,序列号和时间戳都应该是递增的,而序列号的递增量应该为1。但是序列号是一个16bit的域,在长时间的通话过程中有可能存在溢出的情况,这将导致排序结果不正确。通过实验观察,在实际通话过程中这种情况确实存在。如图2所示为采用Ethereal网络数据分析软件抓到的RTP数据包,其中就存在序列号溢出。因此,我们采用时间戳域作为索引对数据包进行排序。待排序的数据特征是数据基本有序,通过综合考虑各种排序算法的时间复杂度和程序实现的复杂度,我们采用直接插入排序法,比较顺序为从后向前。
1.2 补包处理
网络传输的不可靠性还会导致数据包的丢失,可以用填补丢失数据包的方法解决。然而,前一种情况属于非正常缺失,出现的概率很小。VolP系统实现中,常常在检测出通话静音期后,采用停发语音包的方法以减少语音数据传输所占用的带宽。补包处理主要是为了解决这种更为普遍的正常缺失情况。如果不进行补包处理,通话过程中静音期的停顿在恢复出语音后将无法体现,势必严重影响语音还原的效果,还会导致两路音频进行合路后声音的严重不同步。
补包算法是基于RTP协议中的标记域和时间戳域实现的。根据RFC 1889对于RTP协议的描述可以得出以下结论。标记域可以用来判断是否存在静音期,如果标记域置为1,则说明此分组与前一分组之间存在静音期。时间戳记录净荷中的第一个抽样产生的时间。典型的语音编码模式的频率为8000Hz,从一个分组到另一个分组的时间戳值的增量取决于分组中抽样的数量。例如,如果一个分组包括10个语音抽样和一个值为1的时间戳,那么下一个分组的时间戳则为11。考虑到抽样以8000Hz的速率发生(每0.125ms),那么时间戳中10的差别就代表了时间上1.25ms的差别。如果在静音期,没有发送任何分组,那么下一个RTP分组可能包含一个明显比前一个RTP分组大得多的时间戳。
补包算法的具体描述如下:
因为不同的编码方式,有不同的传输速率,所以在无静音期情况下,相邻的两个RTP数据包的时间戳的差值和第一个包的净荷的大小之间的关系因编码方式的不同而有所不同。