- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验四 声音录制程序实现 实验指导
实验四 声音录制程序实现
实验指导
第一部分 如何利用 DirectSound 实现声卡录音
如何利用 DirectSound 对经过声卡和麦克风的数据进行捕获,进行录音,并保存为 wave
格式的文件。
一、使用到的 DirectSound 主要对象
DirectSound 录音用到的三个非常重要的对象:
1、IDirectSoundCapture8 ,设备对象,根据你录音的设备创建的设备对象,利用该对象
可以获取设备的属性。
2、IDirectSoundCaptureBuffer8,缓冲区对象,该对象由设备对象创建,主要用来操作
音频数据。
3、IDirectSoundNotify8 ,事件通知对象,该对象用来通知应用程序从缓冲区中将数据取
走,写入文件保存起来。
二、利用 DirectSound 录音的主要思路
先根据选择的录音设备创建设备对象,然后通过设备对象创建辅助缓冲区对象,开始录
音的时候,设备将数据写入缓冲区,应用程序主动的从缓冲区将数据读出来写文件即可,就
实现了录音功能。这里简单介绍一下 dsound 的通知功能,应用程序会创建一个通知对象,
然后将通知对象邦定,再设定通知位置(position),什么是通知位置,比如缓冲区的大小
为 4000 字节,如果你想当数据达到缓冲区一半的时候能得到通知开始 copy 数据,那么此
时你就可以将通知位置设定为 2000,通知位置可以任意的设定,当缓冲区的数据达到你设
定的位置时,就会通知应用程序将缓冲区的数据 copy 到文件中,缓冲区是循环利用的,当
缓冲区填充满了以后,就会从头开始充填数据,所以,缓冲区就是一边读,一边写的过程。
三、录音的主要步骤
1、枚举录音的设备
2、根据选择的设备创建设备对象
3、利用设备对象创建缓冲区对象
4 、设置通知机制
5、创建工作线程,用来将缓冲区的数据写入文件。
四、用到的数据定义
LPDIRECTSOUNDCAPTURE8 g_pDSCapture = NULL;//设备对象指针
LPDIRECTSOUNDCAPTUREBUFFER g_pDSBCapture = NULL;//缓冲区对象指
针
LPDIRECTSOUNDNOTIFY8 g_pDSNotify = NULL;//用来设置通知的对象接
口
GUID g_guidCaptureDevice = GUID_NULL; //设备id
BOOL g_bRecording = FALSE; //是否正在录音
WAVEFORMATEX g_wfxInput; //输入的音频格式
DSBPOSITIONNOTIFY g_aPosNotify[ NUM_REC_NOTIFICATIONS + 1 ]; //
设置通知标志的数组
HANDLE g_hNotificationEvent; //通知事件
BOOL g_abInputFormatSupported[20];
DWORD g_dwCaptureBufferSize; //录音用缓冲区的大小
DWORD g_dwNextCaptureOffset;//偏移位置
DWORD g_dwNotifySize;// 通知位置
CWaveFile* g_pWaveFile;//
五、使用 DirectSound 录音的关键步骤详细描述
1、枚举录音的设备
如果程序只是想从用户缺省的设备上进行声音的录制,那么就没有必要来枚举出系统中的
所 有 录 音 的 设 备 , 当 你 调 用 DirectSoundCaptureCreate8 或 者 另 外 一 个 函 数
DirectSoundFullDuplexCreate8 的时候,其实就默认指定了一个缺省的录音设备。
当然,在下面的情况下,你就必须要枚举系统中所有的设备,例如,你的应用程序并不支
持所有的输出设备,或者你的应用程需要两个或者多个设备,或者你希望用户自己来选择输
出设备。
枚举设备,你首先要定义一个回调函数,这个回调函数可以被系统中的每个设备来调用,
你可以在各函数做任何事情,这个函数的命名也没有任何的限制,但是函数应该以
DSEnumCallback 为原型,如果枚举没有结束,这个回调函数就返回 TRUE
文档评论(0)