Windows上的⾳频采集技术
采集麦克风输⼊
采集声卡输出
将⾳频数据送⼊声卡进⾏播放
对多路⾳频输⼊进⾏混⾳处理
以下有两份代码可以参考:
a.
b.
1.Windows上⾳频处理的API
在Windows操作系统上,常⽤的⾳频处理技术主要包括:Wave系列API函数、DirectSound、Core Audio。
其中,Core Audio只可以在Vista以上(包括Vista)的操作系统中才能使⽤,主要⽤来取代Wave系列API函数和DirectSound。
Core Audio实现的功能也⽐较强⼤,能实现对麦克风的采集、声卡输出的采集、控制声⾳的播放。
⽽Wave系列的API函数主要是⽤来实现对麦克风输⼊的采集(使⽤WaveIn系列API函数)和控制声⾳的播放(使⽤后WaveOut系列函数)。
DirectSound能够实现的功能估计和Wave系列API差不多,可能会更强⼀些(由于没有使⽤过DirectSound,不太肯定!)。
为了实现采集模块对操作系统的兼容性更好,基本上对麦克风输⼊的采集使⽤WaveIn系列API函数⽐较多;
在Windows XP系统中,没有直接提供对声卡输出进⾏采集的API,因此,在Windows XP要实现对声卡输出的采集会⽐较⿇烦。通常可选⽤⽀持混⾳的声卡,然后通过使⽤声卡的混⾳模块来实现采集,但并不是所有的声卡都⽀持混⾳的功能,这样的⽅案不具备通⽤性。
要实现通⽤性,可以采⽤虚拟声卡的⽅式来实现,从驱动层获取声卡的输出数据,但这种⽅案实现难度会⽐较⼤。
⽽在Vista以上的系统中,如Win7,则可以使⽤Core Audio中的API函数来实现采集声卡输出的功能。
对于混⾳模块的实现,⽬前基本是使⽤⾃定义的混⾳算法来完成功能,系统没有直接的API函数可供调⽤。
2.使⽤WaveIn系列API函数实现麦克风输⼊采集
涉及的API函数:
waveInOpen
开启⾳频采集设备,成功后会返回设备句柄,后续的API都需要使⽤该句柄
调⽤模块需要提供⼀个回调函数(waveInProc),以接收采集的⾳频数据
waveInClose
关闭⾳频采集模块
成功后,由waveInOpen返回的设备句柄将不再有效
waveInPrepareHeader
准备⾳频采集数据缓存的空间
waveInUnprepareHeader
清空⾳频采集的数据缓存
waveInAddBuffer
将准备好的⾳频数据缓存提供给⾳频采集设备
在调⽤该API之前需要先调⽤waveInPrepareHeader
waveInStart
控制⾳频采集设备开始对⾳频数据的采集
waveInStop
控制⾳频采集设备停⽌对⾳频数据的采集
⾳频采集设备采集到⾳频数据后,会调⽤在waveInOpen中设置的回调函数。
其中参数包括⼀个消息类型,根据其消息类型就可以进⾏相应的操作。
如接收到WIM_DATA消息,则说明有新的⾳频数据被采集到,这样就可以根据需要来对这些⾳频数据进⾏处理。
3.使⽤Core Audio实现对声卡输出的捕捉
涉及的接⼝有:
IMMDeviceEnumerator
IMMDevice
IAudioClient
IAudioCaptureClient
主要过程:
创建多媒体设备枚举器(IMMDeviceEnumerator)
通过多媒体设备枚举器获取声卡接⼝(IMMDevice)
win7声卡驱动通过声卡接⼝获取声卡客户端接⼝(IAudioClient)
通过声卡客户端接⼝(IAudioClient)可获取声卡输出的⾳频参数、初始化声卡、获取声卡输出缓冲区的⼤⼩、开启/停⽌对声卡输出的采集
通过声卡采集客户端接⼝(IAudioCaptureClient)可获取采集的声卡输出数据,并对内部缓冲区进⾏控制
4.常⽤的混⾳算法
混⾳算法就是将多路⾳频输⼊信号根据某种规则进⾏运算(多路⾳频信号相加后做限幅处理),得到⼀路混合后的⾳频,并以此作为输出的过程。
我⽬前还做过这⼀块,搜索了⼀下基本有如下⼏种混⾳算法:
将多路⾳频输⼊信号直接相加取和作为输出
将多路⾳频输⼊信号直接相加取和后,再除以混⾳通道数,防⽌溢出
将多路⾳频输⼊信号直接相加取和后,做Clip操作(将数据限定在最⼤值和最⼩值之间),如有溢出就设最⼤值
将多路⾳频输⼊信号直接相加取和后,做饱和处理,接近最⼤值时进⾏扭曲
将多路⾳频输⼊信号直接相加取和后,做归⼀化处理,全部乘个系数,使幅值归⼀化
将多路⾳频输⼊信号直接相加取和后,使⽤衰减因⼦限制幅值
(完)
发布评论