视频会议以其方便、快捷、“面对面”交流的优点逐渐得到了人们的认可,许多企事业单位、教育单位,医疗单位都希望使用视频会议来代替传统的会议形式。在视频会议中,与会者之间主要传输的是音频数据和视频数据,其中的音频数据显得更为重要。因为会议中的大部分有用信息都包含在与会者的言语交流上,所以视频会议系统必须保证音频通信的流畅性和全双工,才能使视频会议更接近于真实的会议环境。
DirectX是Microsoft开发的专门用于开发游戏和多媒体软件的应用程序接口(API),包括了对二维和三维图像、声音、音乐和针对网络多人游戏的网络通信的强大支持。DirectX是一种标准的软件接口,所有主要的硬件供应商都提供支持DirectX的驱动设备,应用DirectX的软件可以在不同的硬件环境下正常运行。另一方面,DirectX能根据所使用的不同硬件,来选择适当的方式使用硬件加速能力,便于开发高质量的多媒体和游戏软件。在DirectX所提供的众多组件中,用于音频处理的是DirectSound组件。为保证视频会议系统中语音的流畅性,需要采用DirectSound中提供的StreamingBuffer(流式缓冲)机制来实现。而为了保证视频会议系统中的全双工音频通信,主要利用的则是DirectSound中的混音机制来实现。
利用StreamingBuffer实现流畅的语音交流
DirectSound中提供了两种缓冲机制,分别是StaticBuffer(静态缓冲)和StreamingBuffer(流式缓冲)。StaticBuffer指一次将一段完整的声音存入缓冲中;StreamingBuffer指的是并不将全部的数据一次读入缓冲,而是在播放声音时动态地读入,占用空间较小。一般来说,如果声音需要反复播放而且容量有限(如游戏音效),使用StaticBuffer更有助于提高程序的效率;相反,如果是容量很大、实时性要求较高的音频数据流,则使用StreamingBuffer为佳。在视频会议系统中,如使用StaticBuffer,则在向缓冲区写入新的音频数据时,声音的回放必然出现短暂停顿,使与会者的完整话语不能够连续播放,影响通话的流畅性,而StreamingBuffer可克服语音不连续的缺点。
StreamingBuffer提供了两个指针:PlayCursor(回放游标)和WriteCursor(写入游标),它们的值只是相对于缓冲区开头的偏移量而非绝对的内存地址。其中PlayCursor总是指向下一个被输出的数据字节,而WriteCursor指向的地址则指明从哪个地方开始可以安全地写入新的音频数据而不影响回放。按回放音频数据的顺序来看,WriteCursor总是在PlayCursor之前,并且它们间保持着一定的间距,而这个间距会根据不同的系统状况而有所不同,实验表明这个间距大概是100~200字节左右。当开始对缓冲区中的音频数据进行循环模式回放时,总是在PlayCursor所指的地方开始。回放后PlayCursor和WriteCursor会保持它们的间距等速度前移,并且PlayCursor总是指向下一个被输出的数据字节。当回放到达缓冲区的结尾处时,PlayCursor将重新指向缓冲区的开头,如此循环下去。而当程序停止对StreamingBuffer中的音频数据进行回放时,PlayCursor则不再移动,并停留在下一个被输出的数据字节处,直到重新回放才会继续前移。