2.1 创建设备对象
调用directsound.DirectSoundCaptureCreate()方法创建音频捕获对象,其参数guid表示录音设备,可由directsound.DirectSoundCaptureEnumerate()函数返回值提供,也可以设为None,表示使用系统默认录音设备。
2.2 创建缓冲区对象
创建缓冲区对象,首先需对一个DSCBUFFERDESC结构对象赋值,指定要创建的缓冲区特征,如缓冲区大小、单双声道、采样率、采样量化位数等。DSCBUFFERDESC结构有两个成员,其中dwBufferBytes定义了缓冲区的大小,lpwfxFormat为WAVEFORMATEX结构对象,规定了声音数据的结构,由pywintypes.WAVEFORMATEX()创建。
WAVEFORMATEX结构包含以下属性:
wFormatTag:格式标识,对于DirectSound只能是WAVE_FORMAT_PCM,表示捕获格式为PCM(Pulse Code Modulation,脉冲编码调制)格式。
nChannels:表示通道数,1为单声道,2为立体声。
nSamplesPerSec:表示采样频率,一般为8000Hz、11025Hz、22050Hz、44100Hz。
wBitsPerSample:表示采样量化位数,通常是8或16。
nBlockAlign:表示采样块字节数,对于PCM是wBitsPerSample*nChannels/8。
nAvgBytesPerSec:表示采样率,以字节为单位,为nBlockAlign和wBitsPerSample的乘积。
通过调用设备对象的方法PyIDirectSoundCapture.CreateCaptureBuffer()创建缓冲区对象,其参数lpDSCBufferDesc即DSCBUFFERDESC结构对象,通过调用directsound.DSCBUFFERDESC()创建。
创建缓冲区对象之后,调用其方法PyIDirectSoundCaptureBuffer.Start()开始采集数据,其参数dwFlags可以设置缓冲区的工作方式:静态缓冲(dwFlags参数设为0)或动态缓冲(dwFlags参数设为directsound.DSCBSTART_LOOPING或1)。其中静态缓冲指一次将一段完整的音频数据写入缓冲,适合容量有限、实时性要求不高的音频数据流;而动态缓冲并不将全部的音频数据一次写入缓冲,而是由程序周期性地动态写入,占用内存空间较小,可以通过使用较小的内存来播放较长的声音,适合于容量大、实时性要求较高的音频数据流。
停止录音时可调用PyIDirectSoundCaptureBuffer.Stop()方法。
2.3 设置通知机制
为确保声音信号的实时采集和处理,应用程序须及时知道什么时候可以开始读取缓冲区内的音频数据。IDirectSoundNotify接口为此提供了一种高效率的方式,即位置通告方式,在缓冲区设定一个或多个通知位置,当缓冲捕获的数据到达设定位置时即发出一个事件通知。当读取位置在缓冲区中循环时,事件将不断地被发送。
首先调用函数win32event.CreateEvent()创建通知事件句柄,其次调用缓冲区对象方法PyIDirectSoundCaptureBuffer.QueryInterface()获取IDirectSoundNotify接口对象,最后通过方法PyDirectSoundNotify.SetNotificationPositions()设置通知位置。
|