使用DirectX技术实现视频会议中的音频通信
发布时间:2008/5/28 0:00:00 访问次数:547
摘 要:本文详细分析如何采用microsoft公司的directx技术,实现视频会议系统中流畅的全双工音频通信功能,这是开发视频会议系统的重要一步。 关键词:directx;全双工;缓冲区 |
前 言 视频会议以其方便、快捷、“面对面”交流的优点逐渐得到了人们的认可,许多企事业单位、教育单位,医疗单位都希望使用视频会议来代替传统的会议形式。在视频会议中,与会者之间主要传输的是音频数据和视频数据,其中的音频数据显得更为重要。因为会议中的大部分有用信息都包含在与会者的言语交流上,所以视频会议系统必须保证音频通信的流畅性和全双工,才能使视频会议更接近于真实的会议环境。
directx是microsoft开发的专门用于开发游戏和多媒体软件的应用程序接口(api),包括了对二维和三维图像、声音、音乐和针对网络多人游戏的网络通信的强大支持。directx是一种标准的软件接口,所有主要的硬件供应商都提供支持directx的驱动设备,应用directx的软件可以在不同的硬件环境下正常运行。另一方面,directx能根据所使用的不同硬件,来选择适当的方式使用硬件加速能力,便于开发高质量的多媒体和游戏软件。在directx所提供的众多组件中,用于音频处理的是direct sound组件。为保证视频会议系统中语音的流畅性,需要采用direct sound中提供的streaming buffer(流式缓冲)机制来实现。而为了保证视频会议系统中的全双工音频通信,主要利用的则是direct sound中的混音机制来实现。
利用streaming buffer实现流畅的语音交流 direct sound中提供了两种缓冲机制,分别是static buffer(静态缓冲)和streaming buffer(流式缓冲)。static buffer指一次将一段完整的声音存入缓冲中;streaming buffer指的是并不将全部的数据一次读入缓冲,而是在播放声音时动态地读入,占用空间较小。一般来说,如果声音需要反复播放而且容量有限(如游戏音效),使用static buffer更有助于提高程序的效率;相反,如果是容量很大、实时性要求较高的音频数据流,则使用streaming buffer为佳。在视频会议系统中,如使用static buffer,则在向缓冲区写入新的音频数据时,声音的回放必然出现短暂停顿,使与会者的完整话语不能够连续播放,影响通话的流畅性,而streaming buffer可克服语音不连续的缺点。
streaming buffer提供了两个指针:play cursor(回放游标)和write cursor(写入游标),它们的值只是相对于缓冲区开头的偏移量而非绝对的内存地址。其中play cursor总是指向下一个被输出的数据字节,而write cursor指向的地址则指明从哪个地方开始可以安全地写入新的音频数据而不影响回放。按回放音频数据的顺序来看,write cursor总是在play cursor之前,并且它们间保持着一定的间距,而这个间距会根据不同的系统状况而有所不同,实验表明这个间距大概是100~200字节左右。当开始对缓冲区中的音频数据进行循环模式回放时,总是在play cursor所指的地方开始。回放后play cursor和write cursor会保持它们的间距等速度前移,并且play cursor总是指向下一个被输出的数据字节。当回放到达缓冲区的结尾处时,play cursor将重新指向缓冲区的开头,如此循环下去。而当程序停止对streaming buffer中的音频数据进行回放时,play cursor则不再移动,并停留在下一个被输出的数据字节处,直到重新回放才会继续前移。另外,在play cursor和write cursor之间的区域被认为是即将要进行回放的数据,所以不能够对其做更新。在理解了streaming buffer的基本工作方式后,接下来详细阐述如何用visual c++作具体实现,其中会涉及到一些visual c++的函数,具体可参考microsoft msdn。
在程序中,设置一个大小为一帧音频数据的大小(一般相当于0.25秒的语音)的2倍的streaming buffer。并且在streaming buffer的正中间和结尾处分别设置标志一个触发事件。程序开始时,通过调用play函数对streaming buffer中的数据进行循环回放。当play cursor到达正中间和结尾时,事件就会产生,就可以通过程序向缓冲区写入新一帧的音频数据。在写入新一帧音频数据的过程中,首先调用lock函数锁定缓冲区中的部分,此时的write cursor被锁定不再前移,而play cursor将跟随着声音的回放继续前进;利用回放play cursor和write cursor间的音频数据的一段时间内,根据锁定时获得的lplpvaudioptr1(此时的lplpvaudioptr1指向的地方就是锁定时write cursor
摘 要:本文详细分析如何采用microsoft公司的directx技术,实现视频会议系统中流畅的全双工音频通信功能,这是开发视频会议系统的重要一步。 关键词:directx;全双工;缓冲区 |
前 言 视频会议以其方便、快捷、“面对面”交流的优点逐渐得到了人们的认可,许多企事业单位、教育单位,医疗单位都希望使用视频会议来代替传统的会议形式。在视频会议中,与会者之间主要传输的是音频数据和视频数据,其中的音频数据显得更为重要。因为会议中的大部分有用信息都包含在与会者的言语交流上,所以视频会议系统必须保证音频通信的流畅性和全双工,才能使视频会议更接近于真实的会议环境。
directx是microsoft开发的专门用于开发游戏和多媒体软件的应用程序接口(api),包括了对二维和三维图像、声音、音乐和针对网络多人游戏的网络通信的强大支持。directx是一种标准的软件接口,所有主要的硬件供应商都提供支持directx的驱动设备,应用directx的软件可以在不同的硬件环境下正常运行。另一方面,directx能根据所使用的不同硬件,来选择适当的方式使用硬件加速能力,便于开发高质量的多媒体和游戏软件。在directx所提供的众多组件中,用于音频处理的是direct sound组件。为保证视频会议系统中语音的流畅性,需要采用direct sound中提供的streaming buffer(流式缓冲)机制来实现。而为了保证视频会议系统中的全双工音频通信,主要利用的则是direct sound中的混音机制来实现。
利用streaming buffer实现流畅的语音交流 direct sound中提供了两种缓冲机制,分别是static buffer(静态缓冲)和streaming buffer(流式缓冲)。static buffer指一次将一段完整的声音存入缓冲中;streaming buffer指的是并不将全部的数据一次读入缓冲,而是在播放声音时动态地读入,占用空间较小。一般来说,如果声音需要反复播放而且容量有限(如游戏音效),使用static buffer更有助于提高程序的效率;相反,如果是容量很大、实时性要求较高的音频数据流,则使用streaming buffer为佳。在视频会议系统中,如使用static buffer,则在向缓冲区写入新的音频数据时,声音的回放必然出现短暂停顿,使与会者的完整话语不能够连续播放,影响通话的流畅性,而streaming buffer可克服语音不连续的缺点。
streaming buffer提供了两个指针:play cursor(回放游标)和write cursor(写入游标),它们的值只是相对于缓冲区开头的偏移量而非绝对的内存地址。其中play cursor总是指向下一个被输出的数据字节,而write cursor指向的地址则指明从哪个地方开始可以安全地写入新的音频数据而不影响回放。按回放音频数据的顺序来看,write cursor总是在play cursor之前,并且它们间保持着一定的间距,而这个间距会根据不同的系统状况而有所不同,实验表明这个间距大概是100~200字节左右。当开始对缓冲区中的音频数据进行循环模式回放时,总是在play cursor所指的地方开始。回放后play cursor和write cursor会保持它们的间距等速度前移,并且play cursor总是指向下一个被输出的数据字节。当回放到达缓冲区的结尾处时,play cursor将重新指向缓冲区的开头,如此循环下去。而当程序停止对streaming buffer中的音频数据进行回放时,play cursor则不再移动,并停留在下一个被输出的数据字节处,直到重新回放才会继续前移。另外,在play cursor和write cursor之间的区域被认为是即将要进行回放的数据,所以不能够对其做更新。在理解了streaming buffer的基本工作方式后,接下来详细阐述如何用visual c++作具体实现,其中会涉及到一些visual c++的函数,具体可参考microsoft msdn。
在程序中,设置一个大小为一帧音频数据的大小(一般相当于0.25秒的语音)的2倍的streaming buffer。并且在streaming buffer的正中间和结尾处分别设置标志一个触发事件。程序开始时,通过调用play函数对streaming buffer中的数据进行循环回放。当play cursor到达正中间和结尾时,事件就会产生,就可以通过程序向缓冲区写入新一帧的音频数据。在写入新一帧音频数据的过程中,首先调用lock函数锁定缓冲区中的部分,此时的write cursor被锁定不再前移,而play cursor将跟随着声音的回放继续前进;利用回放play cursor和write cursor间的音频数据的一段时间内,根据锁定时获得的lplpvaudioptr1(此时的lplpvaudioptr1指向的地方就是锁定时write cursor
热门点击
推荐技术资料
|
|