实验四 声音录制程序实现 实验指导.pdf

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

xxj1658888 + 关注
实名认证
内容提供者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档