实时混音的实现

你的位置:首页 >> 计算机论文 >> 计算机通信论文 >> 新闻正文
实时混音的实现

长沙国防科技大学机电工程与自动化学院  李湘

摘要 本文主要讨论多路声音实时混叠的实现方法,以及实现过程中对一些特殊情况的处理。关键词 Wave 混音 混音器

1.引言

将多个Wave文件或多路Wave数据同时在Wave设备上输出,就可同时听到多个不同的声音,达到混音的效果。如果是将多个不同端点的话音数据经局域网络传输到达某一个端点再经该端点的Wave设备输出,就能同时听到多个人的话音,从而实现局域网络中多方的话音交谈。

在网络上实现话音交谈,特别强调实时性,要尽量保证话音的平滑、连续,因此为了保证话音数据连续,减少话音数据存储带来的延时,在具体实现中,话音的录制和播放都不采用文件的形式,录制和播放的话音数据都存在缓冲区中。在Windows系统中,一般情况下,高层Wave接口函数无法直接播放缓冲区中的话音数据,而必须用底层函数来实现,常用的是Windows API中的Wave函数。将Wave数据在Wave设备上输出使用的是WaveOutWrite函数,但是该函数不支持多路Wave数据的同时播放,为了能达到多路Wave数据同时播放的效果,对缓冲区中多路Wave数据进行必要的预处理后,再提交给Wave输出设备播放。实现原理如图1所示。

1.gif (2068 字节)

图1 多路Wave混音的实现原理

2.实现原理

实时地混音,就是将多路Wave数据进行相互叠加处理到另一个目的缓冲区,最终将该目的的缓冲区提交给Wave输出设备。

将每一路Wave数据作为一个单独通道,分别从每个通道取一数据片段,把取得的几个数据片段相互叠加,然后存进另外一个目的缓冲区中。为了便于处理,缓冲区通常采用数组的形式存放Wave数据。

如果话音数据,采用采样频率1025Hz,8位单声道的数据格式,那么一秒的话音数据量为11025个字节。

为了达到实时的效果,目的缓冲区通常都设置比较小,大约可存放1/8秒的话音数据量,对于前述的话音格式,目的缓冲区的大小为11025/8=1375个字节。

下面具体看一下Wave数据以数组形式存放时的混音过程。如图2所示。

2.gif (1738 字节)

图2 多路Wave数据的叠加过程

假设有4路Wave数据,目的缓冲区的大小为1378,混音子函数调用为 Mixer(lpDest,rgpCDdata,4,1378)。

下面给出混音子函数的实现。其中lpDest为目的缓冲区,rgWaveSrc为多路Wave数据源,iNumWaves为Wave数据源的通道数,wLen为目的缓冲区长度。

Void mixit(LPSAMPLE lpDest,LPSAMPLE rgWaveSrc[],intiNumWaves,WORDwLen)

{int,,iSum;

WORD ctr;

ctr=0

While(wLen)

{

iSum=128;/*静音时数值为128*/

for(I=0;I<iNumWaves;I++)

iSum=iSum+*(rgWaveSrc[]+ctr)-128;

PEG(int)0,iSum,(int)225);/*对转换结果处理*/

*lpDest++=iSum;

ctr++;

wLen--;

}

}

注意一点的是对于单声道数据一个字节表示一个采样值,采样值在0-255之间,各个通道的对应Wave数据相加后,就会溢出,还需要将相加结果转换成0-255之间的数值。

将该目的缓冲区中的Wave数据经WaveOutWrite函数输出,就能同时听到四个不同的声音,当Wave输出设备播放完目的缓冲区中的数据便返回,请求用户提供更多的Wave输出数据,因为Wave输出设备只能输出提交给它的Wave数据;另外,对Wave数据进行混音还需要一定的时间,因此当提交一个目的缓冲区中的数据给Wave输出设备后,就必须马上混叠另一段Wave数据来提交给Wave输出设备,作为下一个输出的数据缓冲区,避免声音输出的中断,后一个目的缓冲区提交后被输出设备放入输出队列中,当第一个目的缓冲区中输出完毕后再输出它的数据,当输出设备在输出第二个目的缓冲区的数据时,又能将第三段数据混合进第一个目的缓冲区中,然后重新提交,直到提交完所有的Wave数据,那时就将停止输出。在实际应用中目的缓冲区的数要多个,一般为3至4个,图3给出了混音、提交的完整过程。

3.gif (3806 字节)

此新闻共有2页 上一页 1 2 下一页

编辑: 作者: 来源:
 
请记住中国最大的免费论文站 chinese163论文库 域名:www.chinese163.com/lunwen/
相关联接        
·Developer/2000中的Forms参数及应用Developer/2000中的Forms参数及应用Developer/2000中的Forms参数及应用
·基于Intranet的储粮测控与粮情分析推理系统的设计与实现
·PowerBuilder和MapInfo的集成开发技术
·实现桌面地理信息系统ArcView和VB5应用程序之间的通讯
·基于耦合度的分布问题研究
 
 

论文分类
经济管理类论文
经济学 财政税收
金融证券 会计论文
统计学 国际贸易
工商管理论文 市场营销
人力资源 公共管理
文秘 保险学
旅游管理 本类其它论文
工学类论文
建筑 机械
电子工程 化工
材料工程 信息化工程
交通 电力
水利 其它工学论文
社会艺术类论文
政治 军事
档案管理  
心理学  
新闻传播 法律论文
哲学 其它社会学
文学 艺术
计算机论文
网络技术 计算机通信
电子商务论文 其它计算机
电信  
理学论文
数学 物理学
化学 生物学
地理地质学 天文学
环境学 其它理学
农/林学 动物学
中医学 西医学
语言教育论文
语言学 汉语
英语 日语
德育 历史
体育 教育体制
语文教育 职业教育
素质教育 其它教学论文
实用文献资料
调查报告 个人简历
求职信 其它申请书
调查报告 工作报告
实习报告 其它报告
入党申请书 毕业论文
   
Copyright © 2002-2004 www.chinese163.com Inc. All rights reserved. chinese163论文库 版权所有